Spring+hibernate 数据库连接泄漏问题
问题发现:
在 mysql 中用 show processlist 命令查看连接的连接状态。
当访问数据库时,如果发现有 sleep 状态的连接,还在创建的新的连接,说明连接泄漏了。
问题原因 :
用 spring 托管 hibernate 一般是在 Dao 层使用 HibernateDaoSupport 类与数据库进行同步,如果使用 HibernateDaoSupport 中的 getSession() 方法进行操作,则会导致数据库连接不能释放,如果设置了连接池,连接池就会得不到用完的连接(虽然查看该连接状态是 sleep, 但该连接不会放回到连接池中),多次后,会报连接池满的错误。
getSession() 这个方法本身其实返回的是与当前事务绑定的 Session 对象,在 HibernateDaoSupport 中使用, HibernateDaoSupport 本身是不负责对这个 Session 对象进行关闭的,所以在其中有一个对应的 releaseSession() 方法必须手动操作,用于关闭 Session 。
解决方案:
用 getHibernateTemplate() 方法获得 hibernateTemplate 对象代替 session 对象进行数据库操作。
a) getHibernateTemplate() .save()/delete() 等常用操作
b) getHibernateTemplate ().bulkUpdate(sql 语句 ) 执行 sql 语句
c) hibernate 回调:
i. getHibernateTemplete().executeFind()
ii. getHibernateTemplete().execute()
本文探讨了使用Spring和Hibernate时出现的数据库连接泄漏问题及其解决办法。通过分析,指出在使用HibernateDaoSupport的getSession方法时,如果没有正确调用releaseSession方法释放连接,将导致连接池中的连接无法被重复利用,最终造成连接泄漏。文章提供了采用getHibernateTemplate方法来避免这一问题的具体实践。
1740

被折叠的 条评论
为什么被折叠?



