当前位置:  开发笔记 > 编程语言 > 正文

JDBC的连接池选项:DBCP与C3P0

如何解决《JDBC的连接池选项:DBCP与C3P0》经验,为你挑选了10个好方法。

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

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

Apache DBCP - http://commons.apache.org/dbcp/

C3P0 - http://sourceforge.net/projects/c3p0

我在博客和其他论坛上阅读了很多关于它们的内容,但无法做出决定.

这两个是否有任何相关的替代方案?



1> j pimmel..:

DBCP已过期而非生产等级.一段时间后,我们对两者进行了内部分析,创建了一个测试夹具,对两者产生负载和并发性,以评估它们在现实生活条件下的适用性.

DBCP始终如一地在我们的测试应用程序中生成异常,并努力达到C3P0能够处理的性能水平,没有任何例外.

C3P0还可以在恢复时稳健地处理数据库断开连接和透明重新连接,而如果链接从其下方取出,则DBCP永远不会恢复连接.更糟糕的是DBCP将Connection对象返回到底层传输已经破坏的应用程序.

从那时起,我们在4个主要的重载消费者网络应用程序中使用了C3P0,并且从未回头.

更新:事实证明,经过多年坐在架子上,Apache Commons民众已经让DBCP摆脱了休眠状态,现在又是一个积极开发的项目.因此我原来的帖子可能已经过时了.

话虽如此,我还没有体验过这个新升级的库的性能,也没有听说它在任何最近的应用程序框架中都是事实上的.


我强烈推荐[HikariCP](http://brettwooldridge.github.io/HikariCP/),但后来我帮忙写了它.
c3p0有一些缺点.它有时无法处理连接峰值.
自从您第一次发布此答案4年以来,情况发生了很大变化,如果可能的话,您是否可以添加共享当前方案的更新?
谢谢!推荐的Proxool替代方案怎么样?当前版本的Hibernate同时包含c3p0和Proxool.

2> wwadge..:

我邀请您试用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,但新所有者保留了旧内容,所以要小心.


+1更新你不写的东西更快!
1,BoneCP很棒.从C3P0切换.它甚至允许我删除我对log4jdbc-remix的依赖,因为它允许语句登录开箱即用!

3> 小智..:

当连接超时时我遇到了DBCP问题所以我试用了c3p0.我打算将其发布到生产中,然后开始进行性能测试.我发现c3p0的表现非常糟糕.我无法将其配置为表现良好.我发现它的速度是DBCP的两倍.

然后我尝试了Tomcat连接池.

这是c3p0的两倍,修复了我在DBCP中遇到的其他问题.我花了很多时间调查和测试3个池.如果要部署到Tomcat,我的建议是使用新的Tomcat JDBC池.



4> 小智..:

对于DBCP的自动重新连接问题,有没有试过使用以下2个配置参数?

validationQuery="Some Query"

testOnBorrow=true



5> Kunal..:

另一种选择是HikariCP.

这是比较基准



6> oᴉɹǝɥɔ..:

现在已经在生产中使用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");



7> 小智..:

以下是一些文章,表明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文章"连接池摊牌".


在单线程环境中速度更快,可能是错误和不稳定,而且在其他任何地方都很容易破坏.

8> toolkit..:

本文中提到了另一种替代方法Proxool .

您可能能够找出Hibernate为其默认连接池实现捆绑c3p0的原因?



9> 小智..:

不幸的是他们都已经过时了.DBCP最近有所更新,另外两个是2-3岁,有许多突出的bug.


公平地说,这些不是大项目,因此您应该期望C3P0/DBCP中的更新越来越少,时间也越来越长.

10> UBIK LOAD PA..:

如果配置正确,Dbcp已准备就绪.

例如,它在商业网站上使用,每天350000访客,并且有200个连接池.

如果您正确配置它,它可以很好地处理超时.

版本2正在进行中,它具有使其可靠的背景,因为已经解决了许多生产问题.

我们将它用于我们的批处理服务器解决方案,它已经运行了数百个批次,可以在数据库中处理数百万行.

由tomcat jdbc pool运行的性能测试表明它具有比cp30更好的性能.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有