Hibernate / c3p0连接泄漏

时间:2010-05-11 17:47:24

标签: 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秒),并查看我们的应用程序中显示的堆栈跟踪。堆栈跟踪来自我们的应用程序中的各种不同方法。这并不是说我们可以指出一种方法,并说它正在泄漏连接。

任何帮助调试此问题的人都将非常感激。

4 个答案:

答案 0 :(得分:12)

我怀疑Hibernate或Spring是否正在泄漏连接,我怀疑某个地方的配置问题正在使您的应用程序运行我们的连接。这就是我要做的事情:

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

  • unreturnedConnectionTimeout设置为大于0的值并结合debugUnreturnedConnectionStackTracestrue,以确定哪些连接正在签出但未返回到池并发布一些生成的堆栈跟踪。

  • 确定发生问题的一个业务流程(一个用例场景),并在此情况下运行测试,直到找到问题为止。

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

答案 1 :(得分:2)

Hibernate和Spring不是泄漏连接的人,你应用程序中的某个地方正在泄漏。我不确定C3P0但是BoneCP(http://jolbox.com)支持检测未关闭的连接(并给你打开它们的堆栈跟踪)+当线程在没有正确的情况下消失时,将关闭任何泄漏的连接清理。

答案 2 :(得分:0)

这篇文章使用参数和堆栈跟踪来描述how to debug c3p0 connection leak issue。希望这有帮助

答案 3 :(得分:0)

查询您的数据库:

select * from pg_stat_activity;

并检查哪些查询的持续时间为idle in transaction状态。尝试在代码中找到它们并研究交易未完成的原因。

在代码/配置中检查的内容很少:

  • 明确提交交易或使用@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" />

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

检查相关文章: