Java Hibernate应用程序中的连接泄漏

Java Hibernate应用程序中的连接泄漏,java,hibernate,Java,Hibernate,我在java企业应用程序部门工作。该应用程序具有用于后端的hibernate框架。由于应用程序中最近的更改,一些代码会使用weblogic server中的所有JDBC连接池 应用程序连接属性是在代码中处理的,对于每个线程,我们使用threadlocal类创建每个会话。所以创建连接没有问题。申请有效期超过5年 我们怀疑最近的代码更改导致了这一重大问题。最后,我们决定使用探查器工具来调查这个问题 在此之前,我将回顾最近的代码更改,那么在回顾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应该包含:

而不是:

  • 如果你正在使用

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


查阅相关文章:


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

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

您可以使用连接池(如)并启用泄漏检测,这应该能够确定连接在代码中的何处被分配且从未返回。您可以使用连接池(如)并启用泄漏检测,这应该可以精确地指出连接在代码中的哪个位置被分配,并且从未返回。您链接到的页面不包含“泄漏”一词,您指的是什么部分?您链接到的页面不包含“泄漏”一词,您指的是什么部分?