Java/JDBC可用的最佳连接池库是什么?
我正在考虑两个主要的候选(免费/开源):
Apache DBCP - http://commons.apache.org/dbcp/ C3P0 - http://sourceforge.net/projects/c3p0
我在博客和其他论坛上读了很多关于他们的文章,但无法做出决定。
有什么相关的替代方案吗?
Java/JDBC可用的最佳连接池库是什么?
我正在考虑两个主要的候选(免费/开源):
Apache DBCP - http://commons.apache.org/dbcp/ C3P0 - http://sourceforge.net/projects/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个线程失败)。
其他回答
本文中还提到了另一种替代方案Proxool。
您可能会发现为什么Hibernate在其默认连接池实现中捆绑c3p0 ?
我刚在DBCP上浪费了一天半时间。尽管我使用的是最新的DBCP版本,但我遇到了与j pimmel完全相同的问题。我完全不推荐DBCP,特别是它在DB消失时将连接从池中抛出,当DB返回时无法重新连接,并且无法动态地将连接对象添加回池中(它永远挂在JDBCconnect I/O套接字读取后)。
我现在切换到C3P0。我在以前的项目中使用过它,它的工作和表现就像一个魅力。
我们遇到了需要引入连接池的情况,我们面前有4个选项。
DBCP2 C3P0 Tomcat JDBC HikariCP
我们根据我们的标准进行了一些测试和比较,决定去HikariCP。 阅读这篇文章,它解释了为什么我们选择HikariCP。
DBCP已经过时,不能生产。前段时间,我们对这两者进行了内部分析,创建了一个测试fixture,针对这两者生成负载和并发性,以评估它们在现实生活条件下的适用性。
DBCP始终在我们的测试应用程序中生成异常,并且难以达到C3P0在没有任何异常的情况下处理的性能水平。
C3P0还健壮地处理了DB断开和恢复上的透明重新连接,而DBCP永远不会恢复连接,如果链接从下面被取出。更糟糕的是,DBCP将Connection对象返回给底层传输中断的应用程序。
从那时起,我们已经在4个主要的重载消费者web应用程序中使用了C3P0,并且从未回头。
更新:经过多年的搁置,Apache Commons终于将DBCP从休眠状态中解放出来,现在它又一次成为了一个积极开发的项目。因此,我原来的帖子可能已经过时了。
也就是说,我还没有体验过这个新升级的库的性能,也没有听说过它在任何最新的应用程序框架中。
已经在生产中使用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");