1

我在 Java 企业应用程序中工作。该应用程序具有用于后端的休眠框架。由于最近应用程序的更改,一些代码使用了来自 weblogic 服务器的所有 JDBC 连接池。

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

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

在此之前,我将回顾最近的代码更改,那么在回顾时我需要牢记在 hibernate 中的关键点是什么?

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

谢谢

4

3 回答 3

5

查询您的数据库:

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" />

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


查看相关文章:

于 2017-05-26T06:57:15.177 回答
2

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

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

于 2013-10-16T15:27:10.477 回答
-1

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

于 2019-12-13T08:06:56.780 回答