Java Hibernate应用程序中的连接泄漏
我在java企业应用程序部门工作。该应用程序具有用于后端的hibernate框架。由于应用程序中最近的更改,一些代码会使用weblogic server中的所有JDBC连接池 应用程序连接属性是在代码中处理的,对于每个线程,我们使用threadlocal类创建每个会话。所以创建连接没有问题。申请有效期超过5年 我们怀疑最近的代码更改导致了这一重大问题。最后,我们决定使用探查器工具来调查这个问题 在此之前,我将回顾最近的代码更改,那么在回顾hibernate时,我需要记住哪些要点 这是非常危急/严重的情况。所以给我一些建议来解决这个问题Java Hibernate应用程序中的连接泄漏,java,hibernate,Java,Hibernate,我在java企业应用程序部门工作。该应用程序具有用于后端的hibernate框架。由于应用程序中最近的更改,一些代码会使用weblogic server中的所有JDBC连接池 应用程序连接属性是在代码中处理的,对于每个线程,我们使用threadlocal类创建每个会话。所以创建连接没有问题。申请有效期超过5年 我们怀疑最近的代码更改导致了这一重大问题。最后,我们决定使用探查器工具来调查这个问题 在此之前,我将回顾最近的代码更改,那么在回顾hibernate时,我需要记住哪些要点 这是非常危急/严
谢谢我过去曾亲自调查过hibernate的问题,我发现官方文档中的这一页已经提供了很多好的建议:
过去我曾亲自调查hibernate的问题,我发现官方文档中的这一页已经提供了很多好的建议:
这通常是由于未关闭的会话造成的。我个人使用的简单方法是创建一个运行会话的表(映射)。在创建时在表中添加条目,在会话结束时在映射上删除(或标记)条目。通过这种方式,您可以确定哪些会话未关闭
好的记录器(slf4/log4j)也可能有用,尤其是NDC()。通常这是由于会话未关闭。我个人使用的简单方法是创建一个运行会话的表(映射)。在创建时在表中添加条目,在会话结束时在映射上删除(或标记)条目。通过这种方式,您可以确定哪些会话未关闭 好的记录器(slf4/log4j)也可能有用,尤其是NDC()。查询您的数据库:
select * from pg_stat_activity;
并检查哪些查询在事务状态下处于长时间空闲状态。尝试在代码中找到它们,并研究事务未完成的原因
添加到
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应该包含:
而不是:
- 如果你正在使用
延迟加载时可能会导致连接泄漏。相关讨论:
查阅相关文章:
select * from pg_stat_activity;
并检查哪些查询在事务状态下处于长时间空闲状态。尝试在代码中找到它们,并研究事务未完成的原因
添加到
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应该包含:
而不是:
- 如果你正在使用
延迟加载时可能会导致连接泄漏。相关讨论:
查阅相关文章: