Hibernate应用程序中的连接泄漏

时间:2013-10-16 15:20:43

标签: java hibernate

我在java企业应用程序中工作。该应用程序具有后端的hibernate框架。由于应用程序最近的更改,某些代码会占用weblogic服务器中的所有JDBC连接池。

应用程序连接是在代码中处理的属性,对于我们使用threadlocal类创建每个会话的每个线程。所以创建连接没有问题。该申请已超过5年。

我们怀疑最近的代码更改会导致这个主要问题。最后,我们决定使用分析器工具来调查此问题。

在此之前,我将回顾最近的代码更改,那么在审核时我需要记住的关键点是什么?

这是非常关键/严重的情况。所以建议我解决这个问题的一些技巧..

由于

4 个答案:

答案 0 :(得分:2)

通常这是由于未关闭的会话。我个人使用的简单方法是创建一个运行会话的表(map)。在创建时,在表中添加条目,并在会话中关闭地图上的删除(或标记)条目。这样,您就可以确定哪些会话未关闭。

良好的记录器(slf4 / log4j)也可能有用,尤其是NDC(http://wiki.apache.org/logging-log4j/NDCvsMDC)。

答案 1 :(得分:2)

查询您的数据库:

select * from pg_stat_activity;

并检查哪些查询的持续时间为idle in transaction状态。尝试在代码中找到它们并研究交易未完成的原因。

添加到persistence.xml

  <property name="hibernate.c3p0.unreturnedConnectionTimeout" value="60"/>
  <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces" value="true"/>

unreturnedConnectionTimeout值应大于0,因为默认值为0 - 无限制。这些属性是更多测试/调试目的,理想情况下不应在生产环境中使用。

在代码/配置中检查的内容很少:

  • 明确提交交易或使用@Transactional。请注意@Transactional仅适用于公共方法。

  • 如果你正在使用Hibernate 5.1.0.Final,那么persistence.xml应该包含:

<property name="hibernate.connection.provider_class" value="org.hibernate.c3p0.internal.C3P0ConnectionProvider" />

而不是:

<property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />

  • 如果您正在使用

<property name="hibernate.enable_lazy_load_no_trans" value="true" />

延迟加载时可能会导致连接泄漏。相关讨论:

检查相关文章:

答案 2 :(得分:0)

过去我不得不自己调查hibernate的问题,我发现官方文档中的这个页面已经提供了很多好的建议:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html

答案 3 :(得分:0)

请检查session.createQuery()中使用的所有实体名称(如果已使用),可能是查询中使用的类名称不匹配。