【JAVA】服务器挂掉卡死的真正元凶!hibernate的session凶手!

来源:互联网 发布:python pyqt安装 编辑:程序博客网 时间:2024/05/16 01:06

这几天做了个多文件上传,看了一整天都检查前台的js错误,以为前台ext脚本问题。后来发现是后台问题。


Session session = getSession();    
list = session.createQuery(hql).list();

这里没有当时我用了session.close();以为关闭了session,但是后来网上说没有关闭资源,然后用

releaseSession(session); //释放session,这样才好了,服务器正常了。真是个大问题。



也可以换成getHibernateTemplate().find(hql)


getSession()在一个线程里如果执行多次的话,会产生多个连接,同时也不会及时释放。


源码中releaseSession(session)方法中也会调用session.close()方法

releaseSession(session)是Spring对session操作进行的包装,而session.close()是Hibernate本身的实现。

session.close(),releaseSession(session)都是关闭session,但releaseSession会判断你是否配置了事务处理,如果有,则不做任何处理.举例来说,假如你service层配置了事务,当你在dao层执行了session.close()程序会报session is close异常,而执行releaseSession(session)的话,则不会,如果你配置了事务,spring会自动帮你close seesion.