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

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

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

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

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


当前回答

要以最佳方式实现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)

谢谢:)

其他回答

我刚在DBCP上浪费了一天半时间。尽管我使用的是最新的DBCP版本,但我遇到了与j pimmel完全相同的问题。我完全不推荐DBCP,特别是它在DB消失时将连接从池中抛出,当DB返回时无法重新连接,并且无法动态地将连接对象添加回池中(它永远挂在JDBCconnect I/O套接字读取后)。

我现在切换到C3P0。我在以前的项目中使用过它,它的工作和表现就像一个魅力。

我们遇到了需要引入连接池的情况,我们面前有4个选项。

DBCP2 C3P0 Tomcat JDBC HikariCP

我们根据我们的标准进行了一些测试和比较,决定去HikariCP。 阅读这篇文章,它解释了为什么我们选择HikariCP。

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

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

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

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

validationQuery="Some Query"

testOnBorrow=true

如果配置正确,Dbcp可以用于生产。

例如,它用于一个每天有350000访问者和200个连接池的商业网站。

只要配置正确,它就能很好地处理超时。

版本2正在进行中,它有一个背景,这使得它可靠,因为许多 生产问题已得到解决。

我们使用它作为我们的批处理服务器解决方案,它已经运行了数百个批次,在数据库中工作数百万行。

由tomcat jdbc池运行的性能测试表明,它的性能优于cp30。