使用JDBC的连接池选项:DBCP vs C3P0

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

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

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

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

这两个有没有相关的select?

DBCP已过时而不是生产等级。 一段时间以来,我们对这两者进行了内部分析,创build了一个testing夹具,在两者之间产生负载和并发性,以评估其在现实生活条件下的适用性。

DBCP一直在我们的testing应用程序中产生exception,并努力达到C3P0无法处理的性能水平。

C3P0也强大地处理DB断开连接和恢复透明重新连接,而DBCP从未恢复连接,如果链接从它下面取出。 更糟糕的是,DBCP正在将Connection对象返回给底层传输已经中断的应用程序。

从那以后,我们在4个主要的重载消费者networking应用中使用了C3P0,并且从未回头过。

更新:事实certificate,经过多年的搁置,Apache Commons民众已经把DBCP从hibernate状态中解放出来,而现在又一次是一个积极开发的项目。 因此,我原来的post可能已经过时了。

话虽如此,我还没有经历过这个新升级的图书馆的performance,也没有听说它在任何最近的应用程序框架事实上。

我邀请您尝试BoneCP – 它是免费的,开源的,比可用的替代品更快(请参阅基准部分)。

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

华莱士

更新:截至2010年3月,仍然比新改写的Apache DBCP(“tomcat jdbc”)池快大约35%。 请参阅基准部分中的dynamic基准链接。

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

更新#3:(9月14日)请考虑BoneCP在这一点上被弃用,build议切换到HikariCP。

更新#4:(15年4月) – 我不再拥有域jolbox.com,但新的所有者保留旧的内容,所以要小心。

当连接超时时,我遇到了DBCP问题,所以我试用了c3p0。 我打算把这个发布到生产环境,然后开始进行性能testing。 我发现c3p0performance非常糟糕。 我无法configuration它执行得很好。 我发现它比DBCP慢两倍。

然后我尝试了Tomcat连接池 。

这是c3p0的两倍,并解决了我与DBCP的其他问题。 我花了很多时间调查和testing这三个池。 如果您部署到Tomcat,我的build议是使用新的Tomcat JDBC池。

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

validationQuery="Some Query" testOnBorrow=true 

现在在生产中已经使用DBCP了几年了。 它是稳定的,DB服务器重新启动生存。 只要正确configuration它。 它只需要指定一些参数,所以不要懒惰。 这里是我们的系统生产代码的一个片段,它列出了我们明确设置的使其工作的参数:

 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确实有一些很好的function,比如准备好的语句池,比DBCP更具可configuration性,但是在我使用过的任何环境中,DBCP都明显更快。

dbcp和c3p0之间的区别? 绝对没有! (Sak开发者博客) http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html

另请参见类似的博客文章中的评论JavaTech文章“连接池摊牌”。

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

您可能能够找出为什么Hibernate将c3p0捆绑到默认的连接池实现?

不幸的是他们都过时了。 DBCP最近更新了一点,另外两个是2-3岁,有很多出色的bug。

如果configuration正确,Dbcp就是生产准备就绪。

例如,在每天350000位访问者的商业网站上使用,并且具有200个连接的池。

它提供了正确的configuration它处理非常好的超时。

版本2正在进行中,并且由于许多生产问题已经被解决,所以它具有使其可靠的背景。

我们将它用于我们的批处理服务器解决scheme,并且已经运行了数百个批处理数据库中的数百万行。

由tomcat jdbc pool运行的性能testing表明它比cp30有更好的性能。

另一种select是HikariCP 。

这是比较基准

刚刚用DBCP浪费了一天半的时间。 即使我正在使用最新的DBCP版本,我也遇到了和pimmel一样的问题。 我根本不会推荐DBCP,特别是当数据库消失时,抛出连接池的诀窍,数据库返回时无法重新连接以及无法dynamic地将连接对象添加回池中(它永远挂起读后JDBCconnect I / O套接字)

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

当我们使用mutithreading项目时,c3p0是很好的。 在我们的项目中,我们通过使用DBCP同时使用了多个线程执行,如果我们使用了更多的线程执行,那么我们得到了连接超时。 所以我们去了c3p0configuration。

DBPool是一个很好用的易于使用的替代scheme。

“基于Java的数据库连接池实用程序,支持基于时间的到期,语句caching,连接validation以及使用池pipe理器的简单configuration。

http://www.snaq.net/java/DBPool/