部署在 Tomcat 上的 DBCP 中的死锁问题

我在Spring配置中使用DBCP数据源(使用默认配置)来管理与数据库的连接,并且当客户端数量增加时,我遇到了死锁情况。

我发现我正在使用的DBCP 1.2.1中存在死锁问题,应该在1.4中解决。所以我升级到了1.4,但问题仍然存在。

在线程转储中,有许多线程被阻止,顶部有以下堆栈跟踪:

   java.lang.Thread.State: WAITING on org.apache.commons.pool.impl.GenericObjectPool$Latch@b6b09e
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:200)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:261)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:631)

欢迎任何建议!


答案 1

几年前,我改用c3p0。你可以试试。我相信你不必改变太多,这只是一个配置游戏。

有点相关的线程,JDBC的连接池选项:DBCP与C3P0。好吧,实际上我让它相关。

[2012年10月19日编辑]

Tomcat 7有一个不错的连接池,The Tomcat JDBC Connection Pool


答案 2

您是否确保共享资源池版本与 dbcp 版本匹配?

另外,我没有在堆栈跟踪中看到死锁,它只是看起来像你有线程等待连接释放。您尝试同时连接多少个线程?您为池等配置了多少个连接?

在调试此类情况时,查看已获得连接的线程正在执行的操作也很有用。


推荐