数据库连接池库的最佳选择是什么? (c3p0问题)

时间:2010-11-22 11:59:11

标签: java database-connection connection-pooling c3p0 apache-commons-dbcp

我使用hirbernate加载了大量的java应用程序。我曾经使用连接池DBCP,但它有连接丢失的问题。比我切换到c3p0。但现在它有时会破解线程,我不知道为什么。像这里:

"1343694829@qtp-515693101-1941" prio=10 tid=0x00007fa6b0940000 nid=0x4e12 runnable [0x00007fa6f8f1c000]
   java.lang.Thread.State: RUNNABLE
    at com.mchange.v2.resourcepool.BasicResourcePool.doCheckinManaged(BasicResourcePool.java:1258)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkinResource(BasicResourcePool.java:647)
    - locked <0x00007fa7286d9728> (a com.mchange.v2.resourcepool.BasicResourcePool)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$ConnectionEventListenerImpl.doCheckinResource(C3P0PooledConnectionPool.java:636)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$ConnectionEventListenerImpl.connectionClosed(C3P0PooledConnectionPool.java:630)
    at com.mchange.v2.c3p0.util.ConnectionEventSupport.fireConnectionClosed(ConnectionEventSupport.java:55)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.fireConnectionClosed(NewPooledConnection.java:510)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:381)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:1246)
    - locked <0x00007fa794ccf020> (a com.mchange.v2.c3p0.impl.NewProxyConnection)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.closeConnection(LocalDataSourceConnectionProvider.java:96)
    at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:474)
    at org.hibernate.jdbc.ConnectionManager.cleanup(ConnectionManager.java:408)
    at org.hibernate.jdbc.ConnectionManager.close(ConnectionManager.java:347)
    at org.hibernate.impl.SessionImpl.close(SessionImpl.java:325)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSession(SessionFactoryUtils.java:791)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSessionOrRegisterDeferredClose(SessionFactoryUtils.java:777)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.releaseSession(SessionFactoryUtils.java:755)

” 我的堆栈跟踪转储显示此线程阻止了所有其他线程,锁定&lt; 0x00007fa7286d9728&gt;,因此在一段时间内服务器被完全阻止。我不知道这个线程运行了多长时间,如果一个线程长时间阻塞所有其他线程,或者这个线程消耗的时间非常长,但结果是,我的系统被完全阻塞并且极其缓慢。我google了很多,但我不知道如何解决这个问题。我需要游泳池关闭连接并尽快完成胎面。我应该使用其他一些连接池吗?对我来说,绝对必要的是,这个池库是100%保存,没有死锁,生命周期,starvations,甚至它比其他库慢一点。

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

您可能希望了解BoneCP - http://jolbox.com

比C3P0 / DBCP好得多,并且到目前为止还没有任何死锁报告。

答案 1 :(得分:1)

1)说到DBCP中的连接丢失是什么意思?你使用MySQL吗?如果在一段时间内没有活动,我知道使用MySQL时连接丢失的问题。是你的情况吗?

2)在高负载应用中使用Hibernate不是很好的选择。 Hibernate过于庞大和缓慢,特别是在复杂的数据和关系上(例如,即使我们只想检索数据,它也需要在每个会话上进行事务处理)

3)可能是因为太多需要线程并且池中没有足够的线程?

我参加了高负荷项目。我们将Hibernate用于软数据(大量请求由几个没有非常复杂映射的记录组成)和自编写的JDBC包装器用于繁重的数据(通过SP进行硬手动映射的数千个记录请求不多)。我们没有任何DBCP问题,只是在长时间不活动时失去与MySQL数据库的连接。