Hibernate/c3p0 连接泄漏

标签 hibernate c3p0

我们正在负载下运行 spring/hibernate/c3p0 应用程序。当我将 c3p0 maxPoolSize 减少到远低于并发用户数时,我们的应用程序就会挂起。日志中没有错误消息,但也没有继续进行。

我预计应用程序会减慢速度,但不会完全停止。

这是我们的 c3p0 配置:

<bean id="coreDataSource" 
          class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close"
          p:driverClass="${core.jdbc.driver}"
          p:jdbcUrl="${core.jdbc.url}"
          p:user="${core.jdbc.user}"
          p:acquireIncrement="5"        
          p:acquireRetryAttempts="10"
          p:acquireRetryDelay="5000"
          p:initialPoolSize="52"
          p:maxIdleTime="3600"
          p:maxIdleTimeExcessConnections="300"
          p:minPoolSize="52"
          p:maxPoolSize="125"
          p:numHelperThreads="6"
          p:unreturnedConnectionTimeout="0">
          <property name="password">
              <bean class="com.docfinity.util.encryption.SpringStringDecrypter"
                  p:decryptFlag="${core.jdbc.decryptPasswordFlag}"
                  p:encryptedString="${core.jdbc.password}" />
          </property>
    </bean>

如果我向它投入 160 个用户,它将锁定。

我尝试将 unreturnedConnectionTimeout 设置为正值(120 秒),并查看了应用程序中显示的堆栈跟踪。堆栈跟踪来 self 们应用程序中的各种不同方法。这并不是说有一种方法我们可以指出它是泄漏连接。

任何调试此问题的帮助将不胜感激。

最佳答案

我怀疑 Hibernate 或 Spring 正在泄漏连接,我怀疑某处存在配置问题,导致您的应用程序运行我们的连接。这是我要做的:

  • 降低并发用户数和池大小,我不确定问题是否与负载相关。

  • 设置unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces 组合为大于 0 的值设置为 true 以确定连接在何处被 check out 且未返回到池中,并发布一些生成的堆栈跟踪。

  • 确定出现问题的一个业务流程(一个用例场景),并仅在此场景上运行测试,直到找出问题为止。

另外,我会用一两个堆栈跟踪更新问题,也许有人会发现一些明显的东西。

关于Hibernate/c3p0 连接泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2813083/

相关文章:

Hibernate - 使用 all-delete-orphan 清除集合然后添加到它会导致 ConstraintViolationException

java - DB 机器 CPU 周期与中端机器 CPU 周期

java - 如何在 Hibernate native 查询中使用常量?

java - 如何在 hibernate 中从数据库获取数据时限制重复

java - Apache 意外暂停发出请求

java - 谁能告诉我为什么会发生这种情况 "org.hibernate.exception.GenericJDBCException: could not execute query"?

java - 如何在 HQL 更新中使用加入?

java - 最新的 c3p0 出现明显的死锁

java - 每当我需要使用 c3Po 池获取连接时,是否有必要在每个类中调用 getConnection() ?