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

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

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

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

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


当前回答

已经在生产中使用DBCP好几年了。它是稳定的,生存DB服务器重启。只要正确配置即可。它只需要指定几个参数,所以不要偷懒。下面是我们系统生产代码中的一个片段,其中列出了我们显式设置的参数,以使其工作:

DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));

driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));

SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");

其他回答

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

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

我的建议是

hikari >德鲁伊> UCP > c3p0 > DBCP

它是基于我所测试的- 20190202,在我的本地测试环境中(4GB mac/mysql in docker/pool minSize=1, maxSize=8), hikari可以服务1024个线程x 1024次来获得连接,每个线程完成的平均时间是1或2百万秒,而c3p0只能服务256个线程x 1024次,每个线程的平均时间已经是2100万秒。(512个线程失败)。

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

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

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

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

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

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

我邀请您尝试BoneCP——它是免费的、开源的,并且比可用的替代方案更快(参见基准测试部分)。

免责声明:我是作者,所以你可以说我有偏见:-)

更新:截至2010年3月,仍然比新重写的Apache DBCP(“tomcat jdbc”)池快35%左右。参见基准测试部分的动态基准测试链接。

更新#2:(2013年12月)在登顶4年后,现在有一个更快的竞争对手:https://github.com/brettwooldridge/HikariCP

更新#3:(9月14日)请考虑BoneCP此时已弃用,建议切换到HikariCP。

更新#4:(2015年4月)—我不再拥有域名jolbox.com

当我们使用多线程项目时,C3p0很好。在我们的项目中,我们使用DBCP同时执行多个线程,然后如果我们使用更多的线程执行,我们就会得到连接超时。所以我们用了c3p0位型。