JDBC的连接池选项:DBCP与C3P0

Dem*_*ema 311 java connection-pooling jdbc c3p0 apache-commons-dbcp

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

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

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

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

j p*_*mel 179

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

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

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

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

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

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

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

wwa*_*dge 176

我邀请您试用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更新你不写的东西更快! (62认同)
  • 1,BoneCP很棒.从C3P0切换.它甚至允许我删除我对log4jdbc-remix的依赖,因为它允许语句登录开箱即用! (3认同)

小智 16

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

然后我尝试了Tomcat连接池.

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


小智 14

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

validationQuery="Some Query"

testOnBorrow=true
Run Code Online (Sandbox Code Playgroud)


Kun*_*nal 13

另一种选择是HikariCP.

这是比较基准


oᴉɹ*_*ǝɥɔ 12

现在已经在生产中使用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");
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

too*_*kit 7

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

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


小智 7

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

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

UBI*_*ACK 7

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

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

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

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

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

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