Hibernate 应用程序中的连接泄漏

Pet*_*ald 1 java hibernate

我在 Java 企业应用程序中工作。该应用程序具有后端的休眠框架。由于最近应用程序的变化,一些代码消耗了来自 weblogic 服务器的所有 JDBC 连接池。

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

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

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

这是非常危急/严重的情况。所以建议我一些提示来解决这个问题..

谢谢

Jus*_*tas 5

查询您的数据库:

select * from pg_stat_activity;
Run Code Online (Sandbox Code Playgroud)

并通过idle in transaction状态检查哪些查询是持久的。尝试在您的代码中找到它们并研究交易未完成的原因。


添加到persistence.xml

  <property name="hibernate.c3p0.unreturnedConnectionTimeout" value="60"/>
  <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces" value="true"/>
Run Code Online (Sandbox Code Playgroud)

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" />

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


查看相关文章: