当前位置: 首页 > 知识库问答 >
问题:

Hibernate应用程序中的连接泄漏

莘聪
2023-03-14

我在做java企业应用。该应用程序后端有hibernate框架。由于应用程序中最近的更改,一些代码消耗了weblogic server中的所有JDBC连接池。

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

我们怀疑最近的代码更改会导致此主要问题。最后,我们决定使用探查器工具来调查此问题。

在此之前,我将回顾一下最近的代码变更,那么在回顾的时候,我需要记住hibernate中的哪些要点呢?

这是非常危急/严重的情况。因此,建议我一些技巧来解决这个问题。

谢谢

共有3个答案

田巴英
2023-03-14

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

闽鸿宝
2023-03-14

这通常是由于会话没有关闭。我个人使用的简单方法是创建一个运行会话的表(图)。创建时在表中添加条目,会话关闭时在地图上删除(或标记)条目。这样,您可以确定哪些会话没有关闭。

好的记录器(slf4/log4j)也可能有用,尤其是NDC(http://wiki.apache.org/logging-log4j/NDCvsMDC).

徐弘图
2023-03-14

查询数据库

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,那么就是持久性。xml应包含:

    <代码>

    而不是:

    <代码>

    • 如果您正在使用

    <代码>

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

    • org.hibernate.LazyInitializationException-无法初始化代理-没有会话
    • 使用hibernate.enable_lazy_load_no_trans解决Hibernate Lazy-Init问题

    查看相关文章:

    • 检测数据库连接泄漏的最佳方法
    • 我们如何修复所有数据库连接泄漏

  •  类似资料:
    • 我已经在谷歌上搜索了4个多小时的stackoverflow来寻找我的问题的解决方案,阅读并试图了解正在发生的事情,但我没有遇到与我的问题相关的解决方案,所以抱歉,如果这听起来像是重复的,我会尽力解释到底发生了什么,这样我就可以深入了解C3P0的内部工作。 我有一个运行在Tomcat上的SpringMVC web应用程序,其中Hibernate、JPA和C3P0是我的池资源。重新加载页面时,应用程序

    • 我在webapp(hibernate-core-4.3.8。Final和Spring 3.2.11。RELEASE)上使用Spring和hibernate。我使用hikaricp(v 2.2.5)作为连接池impl,它检测连接泄漏并打印下面的stacktrac。我使用Spring的声明性事务划分,因此我假设资源的管理和清理是由Spring/hibernate完成的。因此,我认为Spring或hib

    • 在configuration类中: 在中: 这个效果不错。但我的问题是,在每一个请求之后,我会得到越来越多的空闲进程,并且在许多请求之后,我最终会得到以下结果: 这些明显泄漏的原因是什么? 为了完整起见,这里的一些示例在中使用:

    • 是否可以在2.3.9版本中启用泄漏检测?正如我之前在这个问题中所说,HiberNate使用的是HikariCP的2.3.3版本。截至2016年2月,他们已经升级了HikariCP的版本,但不幸的是升级到了2.3.9版本 我需要启用泄漏检测才能修复它们。我已将以下行添加到Hibernate配置文件中: 前两行运行正常,可以在调试日志中看到,但是当我添加第三行时,我无法运行应用程序。我也尝试过用代码添

    • 我有一个Spring/Hibernate应用程序,它与h2-database一起运行。现在,我需要使它连接到一个运行在Docker容器上的Mysql数据库。 Mysql容器直接从Dockerhub页面派生。 在我的应用程序中.我拥有的属性: Mysql容器似乎运行良好。我可以进去看它运行。 那么,问题可能出在哪里呢?

    • 我正在用mssql数据库开发一个java Spring Hibernate应用程序。但是我无法与mssql数据库建立连接。 [请求处理失败;嵌套异常为org.springframework.transaction.CanNotCreateTransactionException:无法打开事务的Hibernate会话;嵌套异常为org.Hibernate.exception.GenericJDBcE