【问题标题】:What is the best choice for database connection pooling library? (c3p0 problem)数据库连接池库的最佳选择是什么? (c3p0 问题)
【发布时间】:2011-05-13 19:26:40
【问题描述】:

我有使用 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)

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

感谢您的帮助

【问题讨论】:

  • 很抱歉碰到了一个旧线程,但前段时间我对这个主题做了一些小研究:stackoverflow.com/questions/5640146/…
  • 抱歉发表评论。大哥,你现在用的是哪个连接池库?

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


【解决方案1】:

您不妨看看 BoneCP - http://jolbox.com

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

【讨论】:

  • BoneCP 没有得到太多的开发,我们在创建比它应该的更多的连接时遇到了问题。随着开发人员恢复工作,我们正在考虑回到 C3P0。
  • BoneCP 开发已重启。
  • 很高兴听到这个消息,同时我们已经开始使用 Tomcat 池,到目前为止它似乎做得很好。
  • BoneCP 自 2014 年起已弃用
【解决方案2】:

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

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

3) 可能是因为需要的线程太多而池中的线程不够?

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

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多