tomcat-dbcp与commons-dbcp


71

这两个连接池库之间似乎有很多混淆。我想知道哪个更好(如果有的话)?

我要提出以下几点...有人可以验证吗?

  1. Tomcat DBCP:使用默认的tomcat-dbcp.jar,它将出现在您的tomcat / lib目录中。您不需要在web-inf / lib中使用commons-dbcp.jar或commons-pool.jar库。数据库驱动程序应放置在tomcat / lib中。

  2. Tomcat DBCP数据源类为org.apache.tomcat.dbcp.dbcp.BasicDataSource。Commons DBCP数据源类为org.apache.commons.dbcp.BasicDataSource

  3. 两者之间的唯一区别可以在此博客中找到。不知道信息是否正确。

  4. Tomcat的官方文档清楚地提到,大多数类都刚刚被重命名和重新打包。

因此,问题是:使用哪一个更好


在所有的Tomcat的安装我也碰到过,到目前为止,tomcat-dbcp.jar根本存在,并且commons-dbcp.jar是Tomcat的lib目录中的一部分。也就是说,直到有人从ASF网站下载Tomcat并尝试在上周运行它。所以,绝对很奇怪。
mirabilos

Answers:


37

Tomcat DBCP只是Apache Commons DBCP的重命名版本,并且内部包名称前缀也不同。

在构建时,Tomcat将获取Commons DBCP源(版本取决于Tomcat版本,例如Tomcat 7.0.27使用Commons DBCP 1.4),并进行软件包名称替换(org.apache.commons-> org.apache.tomcat.dbcp)并将结果构建为tomcat-dbcp.jar

这样做是为了使内部Tomcat JDBC池永远不会与Commons DBCP类的可能的应用程序使用冲突。这避免了许多潜在的类加载问题。

编辑: “ dbcp”包是关于数据源管理。对于纯池实现,Commons DBCP依赖于Commons Pool(程序包org.apache.commons.pool),但是在Tomcat中,该池的实现被Tomcat自己的JDBC池(程序包org.apache.tomcat.jdbc.pool)代替。


18
是真的吗 Tomcat DBCP文档的第一部分声称两者之间存在许多差异。
pimlottc 2012年

2
我编辑了答案,以添加有关泳池故事的说明。
弗洛伦·纪尧姆

1
pomlottc的链接指向Tomcat JDBC连接池(org.apache.tomcat.jdbc.pool),它是一个单独的库
matt b

@FlorentGuillaume,当您说“在Tomcat中,该池的实现已由Tomcat自己的JDBC池替换”时,您是在指的是tomcat重新打包的dbcp吗?
Marplesoft

1
@Marplesoft不,我指的是Tomcat现在使用的新池实现jdbc-pool。该链接说明了为什么现在使用它。
Florent Guillaume

14

这两个连接池库之间似乎有很多混淆。我想知道哪个更好(如果有的话)?

TL / DR:这些是相同的,请勿使用它们中的任何一个。

Tomcat-dbcp是Tomcat分发中包含的Apache Commons Pool的原始重新打包。为了避免类冲突,程序包已重命名为org.apache.tomcat.dbcp.dbcp。*

在Tomcat 7中(从2011年7月的7.0.19开始),默认的Tomcat程序包中包含了一个附加的连接池(作为tomcat-jdbc.jar的一部分),以替代陈旧的Apache Commons实现,称为“ Tomcat JDBC连接池”:

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

本文介绍了两者之间的区别:

http://vigilbose.blogspot.com/2009/03/apache-commons-dbcp-and-tomcat-jdbc.html

简短摘要为什么新的Tomcat池更好:

  • 积极支持
  • 体积更小,更易于理解和维护(如果您希望查看源代码)
  • 支持所有commons-dbcp功能+添加了超级有用的功能,例如“ initSQL”,“ validationInterval”,“ jdbcInterceptors”等

惊人的解释!
奥利弗

5
这很令人困惑:TL/DR: these are the same, don't use either of themvs.Short summary why new Tomcat pool is better
Xiao

11

较早版本的Apache Commons DBCP(即1.2版)在高负载条件下存在一些讨厌的线程安全问题,使其不适合这种用法。Tomcat的人员重新解决了这些问题,这不足为奇。

但是,我的理解是Commons DBCP 1.4解决了这些问题。我个人无法确认,但是可能会使Tomcat版本变得多余。

有趣的是,SpringSource还为他们的重新打包的Tomcat(tc-Server)版本重写了Commons DBCP,他们声称从中获得了巨大的性能优势。不过,他们还没有开源。


4
DBCP 1.4在性能上比1.2有了很大的提高,自升级以来,我再也没有更多的死锁或线程安全问题。
Chochos 2011年

@Chochos:很高兴知道。这是用于哪种应用程序?
skaffman 2011年

一个事务性交换机,每天执行200K +次操作。很多短的1-5行查询,很多更新和插入。
Chochos 2011年

6

Tomcat 7继续使用DBCP。主要原因可能隐藏在他们的Tomcat文档中:

  • 可以将Apache Commons DBCP配置为跟踪和恢复这些废弃的数据库连接。它不仅可以恢复它们,还可以为打开这些资源而从未关闭它们的代码生成堆栈跟踪。

  • Tomcat jdbc-pool库,在高度并发的情况下可能会更快,但无法自动关闭和释放语句(开发人员忘记关闭了该语句),从而导致某些jdbc驱动程序中的内存泄漏。

但是,DBCP代码的问题之一是它们使用的委托模型,当前其最新版本支持JDK1.6和更低版本。支持1.7意味着至少更改其类的四分之一,这是JDBC池库成立的原因之一。

注意:经过进一步调查,JDBC池确实有一种使用StatementFinalizer拦截器在连接关闭时关闭打开语句的方法。


4

只需在此处添加:我已经注意到了一个有趣的行为,尽管这是预期的,但是却找不到任何文档:

对于Tomcat,您需要定义Tomcat工厂(org.apache.tomcat.jdbc.pool.DataSourceFactory或其他Tomcat工厂),否则它将作为Common DBCP工作。

Common DBCP和Tomcat DBCP的默认值之间存在差异,特别是testOnBorrowtrue在Common DBCP中,但false在Tomcat DBCP中)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.