Hibernate/c3p0连接泄漏

10
我们正在运行一个基于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个回答

12

我怀疑Hibernate或Spring没有泄露连接,我认为问题出在某个配置上,导致您的应用程序连接不够。这是我的建议:

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

  • unreturnedConnectionTimeout设置为大于0的值,并将debugUnreturnedConnectionStackTraces设置为true,以找出哪些连接被检出但未返回到连接池中,并发布一些生成的堆栈跟踪信息。

  • 确定一个业务流程(一种使用情况),在此场景下运行测试,直到找到问题所在。

此外,我建议更新问题并提供一到两个堆栈跟踪信息,也许会有人发现明显的问题。


2
Hibernate和Spring并不是泄漏连接的罪魁祸首,你的应用程序中某处正在泄漏连接。我不确定C3P0是否也一样,但BoneCP (http://jolbox.com) 支持检测未关闭的连接(并提供打开连接的堆栈跟踪),当线程没有适当清理时,将关闭任何泄漏的连接。

0

0

查询您的数据库:

select * from pg_stat_activity;

并检查哪些查询在“事务空闲”状态下持续时间长。尝试在代码中找到它们,并研究为何事务未完成。


在代码/配置中需要检查的几个事项:

  • 显式提交事务或使用@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" />

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


查看相关文章:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接