oracle9.2.0.7 spring hibernate 环境。遇到java多线程模块连接数据库,产生连接占满的问题,查看数据库中,当前session正在执行的sql是,ALTER SESSION SET TIME_ZONE='+8:00' NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA',即多为连接建立后并未执行sql的session。由于采用的是hibernate spring架构,所以连接未关闭的问题,可以不考虑。最后结论如下:
1.那些执行sql的getSession()方法依然要注意自己关闭连接,而且多线程环境下,关闭连接要先判断session是否为null,防止出现多次关闭的Exception。
2.其次出现多个ALTER SESSION SET TIME_ZONE='+8:00' NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA' session是由于dao代码中加入了synchronized标记,使得多线程串行调用,即打开了多个连接,但是只有一个连接在执行sql。
3.对于需要越过hibernate,自己获取session的时候,建议使用getCurrentSession()方法。这个方法通过在hibernate中配置
thread
可以,使得session和thread绑定,重要的是session可以随着thread自动关闭,从而减少了关闭session麻烦。
4.连接池的设定也是有讲究的,这个明天总结。
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/146865/viewspace-1019396/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/146865/viewspace-1019396/