我在 Java 企业应用程序中工作。该应用程序具有后端的休眠框架。由于最近应用程序的变化,一些代码消耗了来自 weblogic 服务器的所有 JDBC 连接池。
应用程序连接是在代码中处理的属性,对于每个线程,我们使用 threadlocal 类创建每个会话。所以创建连接没有问题。该应用程序已使用超过 5 年。
我们怀疑最近的代码更改导致了这个主要问题。最后我们决定使用分析器工具来调查这个问题。
在此之前,我将回顾最近的代码更改,那么我在回顾时需要记住的 hibernate 关键点是什么?
这是非常危急/严重的情况。所以建议我一些提示来解决这个问题..
谢谢
查询您的数据库:
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" />
延迟加载时可能会导致连接泄漏。相关讨论:
查看相关文章:
| 归档时间: |
|
| 查看次数: |
10685 次 |
| 最近记录: |