Java/JDBC可用的最佳连接池库是什么?

我正在考虑两个主要的候选(免费/开源):

Apache DBCP - http://commons.apache.org/dbcp/ C3P0 - http://sourceforge.net/projects/c3p0

我在博客和其他论坛上读了很多关于他们的文章,但无法做出决定。

有什么相关的替代方案吗?


当前回答

对于与DBCP的自动重新连接问题,是否尝试使用以下2个配置参数?

validationQuery="Some Query"

testOnBorrow=true

其他回答

一个很好的易于使用的替代方法是DBPool。

“一个基于java的数据库连接池实用程序,支持基于时间的过期、语句缓存、连接验证以及使用池管理器轻松配置。”

http://www.snaq.net/java/DBPool/

对于与DBCP的自动重新连接问题,是否尝试使用以下2个配置参数?

validationQuery="Some Query"

testOnBorrow=true

不幸的是,它们都过时了。DBCP最近更新了一些,另外两个已经有2-3年的历史了,有很多突出的bug。

要以最佳方式实现C3P0,请检查这个答案

C3P0:

对于企业应用,C3P0是最好的方法。 C3P0是一个易于使用的库,用于用jndi绑定的数据源来增强传统的(基于drivermanager的)JDBC驱动程序,包括实现连接和语句池的数据源,如jdbc3规范和jdbc2 std扩展所描述的那样。 C3P0还健壮地处理了DB断开和恢复上的透明重新连接,而DBCP永远不会恢复连接,如果链接从下面被取出。

这就是为什么c3p0和其他连接池也有准备好的语句缓存——它允许应用程序代码避免处理所有这些。这些语句通常保存在一些有限的LRU池中,因此常见语句重用PreparedStatement实例。

更糟糕的是,DBCP将Connection对象返回给底层传输中断的应用程序。 c3p0的一个常见用例是替换Apache Tomcat中包含的标准DBCP连接池。程序员经常会遇到DBCP连接池中没有正确回收连接的情况,在这种情况下,c3p0是一个有价值的替代品。

在当前的更新中,C3P0有一些出色的功能。这些因素如下:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize();
dataSource.setMaxPoolSize();
dataSource.setMaxIdleTime();
dataSource.setMaxStatements();
dataSource.setMaxStatementsPerConnection();
dataSource.setMaxIdleTimeExcessConnections();

在这里,最大池大小和最小池大小定义了连接的边界,即此应用程序将采用的最小连接和最大连接。MaxIdleTime()定义何时释放空闲连接。

DBCP:

This approach is also good but have some drawbacks like connection timeout and connection realeasing. C3P0 is good when we are using mutithreading projects. In our projects we used simultaneously multiple thread executions by using DBCP, then we got connection timeout if we used more thread executions. So we went with c3p0 configuration. I would not recommend DBCP at all, especially it's knack of throwing connections out of the pool when the DB goes away, its inability to reconnect when the DB comes back and its inability to dynamically add connection objects back into the pool (it hangs forever on a post JDBCconnect I/O socket read)

谢谢:)

另一种选择是HikariCP。

下面是比较基准