什么是可用于Java/JDBC的最佳连接池库?
我正在考虑2个主要候选人(免费/开源):
Apache DBCP - http://commons.apache.org/dbcp/
C3P0 - http://sourceforge.net/projects/c3p0
我在博客和其他论坛上阅读了很多关于它们的内容,但无法做出决定.
这两个是否有任何相关的替代方案?
DBCP已过期而非生产等级.一段时间后,我们对两者进行了内部分析,创建了一个测试夹具,对两者产生负载和并发性,以评估它们在现实生活条件下的适用性.
DBCP始终如一地在我们的测试应用程序中生成异常,并努力达到C3P0能够处理的性能水平,没有任何例外.
C3P0还可以在恢复时稳健地处理数据库断开连接和透明重新连接,而如果链接从其下方取出,则DBCP永远不会恢复连接.更糟糕的是DBCP将Connection对象返回到底层传输已经破坏的应用程序.
从那时起,我们在4个主要的重载消费者网络应用程序中使用了C3P0,并且从未回头.
更新:事实证明,经过多年坐在架子上,Apache Commons民众已经让DBCP摆脱了休眠状态,现在又是一个积极开发的项目.因此我原来的帖子可能已经过时了.
话虽如此,我还没有体验过这个新升级的库的性能,也没有听说它在任何最近的应用程序框架中都是事实上的.
我邀请您试用BoneCP - 它是免费的,开源的,并且比可用的替代品更快(参见基准测试部分).
免责声明:我是作者所以你可以说我有偏见:-)
更新:截至2010年3月,仍然比新重写的Apache DBCP("tomcat jdbc")池快35%左右.请参阅基准测试部分中的动态基准链
更新#2:(2013年12月)经过4年的顶峰,现在有一个更快的竞争对手:https://github.com/brettwooldridge/HikariCP
更新#3:(2014年 9月)此时请考虑弃用 BoneCP ,建议切换到HikariCP.
更新#4:(2015年4月) - 我不再拥有域名jolbox.com,但新所有者保留了旧内容,所以要小心.
当连接超时时我遇到了DBCP问题所以我试用了c3p0.我打算将其发布到生产中,然后开始进行性能测试.我发现c3p0的表现非常糟糕.我无法将其配置为表现良好.我发现它的速度是DBCP的两倍.
然后我尝试了Tomcat连接池.
这是c3p0的两倍,修复了我在DBCP中遇到的其他问题.我花了很多时间调查和测试3个池.如果要部署到Tomcat,我的建议是使用新的Tomcat JDBC池.
对于DBCP的自动重新连接问题,有没有试过使用以下2个配置参数?
validationQuery="Some Query" testOnBorrow=true
另一种选择是HikariCP.
这是比较基准
现在已经在生产中使用DBCP几年了.它是稳定的,幸存数据库服务器重启.只需正确配置它.它只需要指定一些参数,所以不要太懒惰.以下是我们的系统生产代码的片段,其中列出了我们明确设置的参数以使其工作:
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的性能远远高于C3P0或Proxool.另外根据我自己的经验,c3p0确实有一些很好的功能,比如预处理语句池,比DBCP更可配置,但DBCP在我使用它的任何环境中都明显更快.
dbcp和c3p0之间的区别?绝对没有!(Sakai开发者博客)
http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html
另请参阅博客文章评论中的JavaTech文章"连接池摊牌".
本文中提到了另一种替代方法Proxool .
您可能能够找出Hibernate为其默认连接池实现捆绑c3p0的原因?
不幸的是他们都已经过时了.DBCP最近有所更新,另外两个是2-3岁,有许多突出的bug.
如果配置正确,Dbcp已准备就绪.
例如,它在商业网站上使用,每天350000访客,并且有200个连接池.
如果您正确配置它,它可以很好地处理超时.
版本2正在进行中,它具有使其可靠的背景,因为已经解决了许多生产问题.
我们将它用于我们的批处理服务器解决方案,它已经运行了数百个批次,可以在数据库中处理数百万行.
由tomcat jdbc pool运行的性能测试表明它具有比cp30更好的性能.