我在java企业应用程序中工作。该应用程序具有后端的hibernate框架。由于应用程序最近的更改,某些代码会占用weblogic服务器中的所有JDBC连接池。
应用程序连接是在代码中处理的属性,对于我们使用threadlocal类创建每个会话的每个线程。所以创建连接没有问题。该申请已超过5年。
我们怀疑最近的代码更改会导致这个主要问题。最后,我们决定使用分析器工具来调查此问题。
在此之前,我将回顾最近的代码更改,那么在审核时我需要记住的关键点是什么?
这是非常关键/严重的情况。所以建议我解决这个问题的一些技巧..
由于
答案 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()中使用的所有实体名称(如果已使用),可能是查询中使用的类名称不匹配。