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

Java 数据库连接池库的最佳选择是什么?(c3p0问题),java,database-connection,connection-pooling,c3p0,apache-commons-dbcp,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.

我有使用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)
”1343694829@qtp-515693101-1941“prio=10 tid=0x00007FA6B094000 nid=0x4e12可运行[0x00007fa6f8f1c000]
java.lang.Thread.State:可运行
位于com.mchange.v2.resourcepool.BasicResourcePool.doCheckinManaged(BasicResourcePool.java:1258)
位于com.mchange.v2.resourcepool.BasicResourcePool.checkinResource(BasicResourcePool.java:647)
-锁定(com.mchange.v2.resourcepool.BasicResourcePool)
位于com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$ConnectionEventListenerImpl.doCheckinResource(C3P0PooledConnectionPool.java:636)
位于com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$ConnectionEventListenerImpl.connectionClosed(C3P0PooledConnectionPool.java:630)
位于com.mchange.v2.c3p0.util.ConnectionEventSupport.fireConnectionClosed(ConnectionEventSupport.java:55)
在com.mchange.v2.c3p0.impl.NewPooledConnection.fireConnectionClosed上(NewPooledConnection.java:510)
在com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:381)
在com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:1246)
-已锁定(com.mchange.v2.c3p0.impl.NewProxyConnection)
位于org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.closeConnection(LocalDataSourceConnectionProvider.java:96)
位于org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:474)
位于org.hibernate.jdbc.ConnectionManager.cleanup(ConnectionManager.java:408)
位于org.hibernate.jdbc.ConnectionManager.close(ConnectionManager.java:347)
位于org.hibernate.impl.SessionImpl.close(SessionImpl.java:325)
位于org.springframework.orm.hibernate3.SessionFactoryUtils.closeSession(SessionFactoryUtils.java:791)
位于org.springframework.orm.hibernate3.SessionFactoryUtils.closeSessionOrRegisterDeferredClose(SessionFactoryUtils.java:777)
位于org.springframework.orm.hibernate3.SessionFactoryUtils.releaseSession(SessionFactoryUtils.java:755)
" 我的stacktrace转储显示这个线程用锁阻塞了我的所有其他线程,所以在一段时间内服务器被完全阻塞。我不确定这个线程运行多长时间,如果一个线程阻塞了所有其他线程很长时间,或者这个线程占用的时间非常长,但结果是,我的系统被完全阻塞,速度非常慢。我在谷歌上搜索了很多,但我不知道如何解决这个问题。我需要泳池关闭连接并尽快完成踩踏。我应该使用其他连接池吗?对我来说,这是绝对必要的,这个池库是100%节省,没有死锁,生命线,饥饿,甚至它比其他库稍微慢一点

感谢您的帮助

1)您所说的DBCP中的连接丢失是什么意思?你使用MySQL吗?我知道,如果在一段时间内没有任何活动,使用MySQL会出现连接丢失的问题。这是你的案子吗

2) 在高负载应用程序中使用Hibernate不是很好的选择。Hibernate的容量太大,速度太慢,尤其是在复杂的数据和关系上(例如,即使我们只想检索数据,它在每个会话上都需要事务)

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


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

您可能希望看看BoneCP-


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

BoneCP不再有太多的开发,我们在创建比它应该的多得多的连接方面遇到了问题。我们正在考虑回到C3P0,因为开发人员已经恢复了对它的工作。BoneCP开发已经重新启动。很高兴听到,与此同时,我们已经开始使用Tomcat池,到目前为止它似乎做得很好。BoneCP从2014年起就被弃用了。很抱歉,遇到了一个旧线程,但不久前,我做了一些关于这个主题的小研究:抱歉评论。兄弟,你现在用的是哪个连接池库?