休眠/ c3p0连接泄漏
我们正在加载运行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秒),并查看了我们应用程序中显示的堆栈跟踪。堆栈跟踪来自我们应用程序中的各种不同方法。这不像我们可以指出的一种方法,并说它正在泄漏连接。
任何帮助调试这个问题将不胜感激。
我怀疑Hibernate或Spring是否在泄漏连接,我怀疑有一个配置问题让你的应用程序运行我们的连接。这是我会做的:
减少并发用户数和池大小,我不知道问题是负载相关。
设置
unreturnedConnectionTimeout
大于0
结合debugUnreturnedConnectionStackTraces
到true
值来找出连接被检查出,而不是返回到池中,并张贴了一些产生的堆栈跟踪的。确定出现问题的一个业务流(一个用例场景),并在此场景中运行测试,直到找出问题。
另外,我会更新一个或两个堆栈跟踪的问题,也许有人会发现一些明显的东西。
Hibernate和Spring并不是泄漏连接的东西,在你的应用程序的某个地方正在泄漏。我不确定C3P0,但BoneCP(http://jolbox.com)支持检测未关闭的连接(并为您打开它们的位置提供堆栈跟踪)+会在线程中断而没有正确清理时关闭任何泄漏连接。
查询数据库:
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" />
它可能会导致连接泄漏时迟缓装载。相关讨论:
- org.hibernate.LazyInitializationException - could not initialize proxy - no Session
- Solve Hibernate Lazy-Init issue with hibernate.enable_lazy_load_no_trans
检查相关文章: