2010-05-11 144 views
9

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

我希望应用程序放慢速度,但不要完全停止。

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

任何帮助调试这个问题将不胜感激。

回答

10

我怀疑Hibernate或Spring是否在泄漏连接,我怀疑有一个配置问题让你的应用程序运行我们的连接。这是我会做的:

  • 减少并发用户数和池大小,我不知道问题是负载相关。

  • 设置unreturnedConnectionTimeout大于0结合debugUnreturnedConnectionStackTracestrue值来找出连接被检查出,而不是返回到池中,并张贴了一些产生的堆栈跟踪的。

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

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

2

Hibernate和Spring并不是泄漏连接的东西,在你的应用程序的某个地方正在泄漏。我不确定C3P0,但BoneCP(http://jolbox.com)支持检测未关闭的连接(并为您打开它们的位置提供堆栈跟踪)+会在线程中断而没有正确清理时关闭任何泄漏连接。

0

查询数据库:

select * from pg_stat_activity; 

并检查其查询长着idle in transaction状态持续。尝试在你的代码中找到它们,并研究为什么事务没有完成。


几项检查的代码/配置:

  • 提交事务明示或使用@Transactional。请注意0​​只适用于公共方法。

  • 如果您在使用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" />

它可能会导致连接泄漏时迟缓装载。相关讨论:


检查相关文章: