hibernate数据库无法获取连接导致系统运行故障
博客专区 > xiaoqqq 的博客 > 博客详情
hibernate数据库无法获取连接导致系统运行故障
xiaoqqq 发表于3年前
hibernate数据库无法获取连接导致系统运行故障
  • 发表于 3年前
  • 阅读 16
  • 收藏 0
  • 点赞 0
  • 评论 0
摘要: hibernate建立的数据库链接无法自动释放, 导致数据库连接数过多, 从而导致程序无法获取数据库链接, 系统进入假死状态。

起因:

某银行上线很久的系统, 每隔一个月左右就会宕机一次。其他同事排查后发现是因为数据库连接超过最大值, 后续用户登陆的时候获取不到连接,导致系统处于假死状态。

问题分析:

出现这种问题基本可以确定是数据库连接泄漏,但是具体是什么原因导致的连接泄漏需要从代码中查找。

排查后

1. 发现web.xml中配置了openSessionInView, 这个配置允许所有线程使用同一个session, 但是 singleSession却是false, 这个配置又不允许所有线程使用同一个session, 这样就相当于没有配置。

<filter>
		<filter-name>hibernateFilter</filter-name>
		<filter-class>
			org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
		</filter-class>
		<init-param>
			<param-name>singleSession</param-name>
			<param-value>false</param-value>
		</init-param>
	</filter>

2. 公共事务中配置了

<prop key="*">PROPAGATION_REQUIRED</prop>
这个配置的作用是 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
说明不会出现因为没有事务, 而导致的在service中直接调用getCurrentSession()后连接不会自动释放的问题。

3. 部分代码如下:


Session session = this.getHibernateTemplate().getSessionFactory().openSession();



问题就出在这里了, openSession()新开一个hibernate session后, 他是不受spring事务管理的, 必须手动进行关闭, 而项目之所以一个月要重启一次, 就是因为这里的连接没有释放, 导致其他线程无法获取链接。



共有 人打赏支持
粉丝 10
博文 49
码字总数 28582
×
xiaoqqq
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: