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

6

我有一个使用Hibernate的高负载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)

我的堆栈跟踪转储显示,这个线程使用锁<0x00007fa7286d9728>,阻塞了所有其他线程,因此服务器在一段时间内完全被阻塞。我不确定这个线程运行了多长时间,如果一个线程长时间阻塞了所有其他线程,或者只是这个线程消耗的时间极长,但结果是,我的系统完全被阻塞并且极慢。我搜索了很多,但不知道如何解决这个问题。我需要池来关闭连接并尽快完成线程。我应该使用其他连接池吗?对于我来说,这个池库绝对必须是100%安全的,没有死锁、活锁、饥饿,即使它比其他库稍微慢一点。

感谢任何帮助


抱歉顶起了一个旧帖子,但是我之前对这个主题进行了一些小研究:https://dev59.com/1m035IYBdhLWcg3wE7xr - Vladislav Rastrusny
抱歉打扰了。兄弟,你现在使用的连接池库是哪个? - Md. Sajedul Karim
2个回答

3
你可以看一下BoneCP - http://jolbox.com,它比C3P0/DBCP性能更好,并且目前没有任何死锁报告。

BoneCP现在已经没有太多的开发了,我们使用它时出现了比预期更多的连接问题。我们正在考虑回到C3P0,因为开发者已经恢复了对它的工作。 - leebutts
BoneCP的开发已经重新启动。 - wwadge
很高兴听到这个消息,与此同时,我们已经开始使用Tomcat池,目前看来它表现得非常出色。 - leebutts
BoneCP自2014年起已被弃用。 - Ajeesh

1

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

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

3) 可能的原因是线程池中需要的线程过多,而可用线程不足?

我参与了一个高负载项目。我们使用Hibernate处理软数据(大量请求由几条记录组成,映射不是很复杂),并使用自编写的JDBC包装器处理重数据(不是很多请求,通过SP传输数千条记录,需要手动映射)。除了长时间不活动后与MySQL数据库的连接丢失之外,我们没有遇到任何DBCP问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接