Tomcat-dbcp vs commons-dbcp

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

这里有一些观点,我想提出... 有人可以证实吗?

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

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

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

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

所以问题是: 用哪一个,哪一个更好

53861 次浏览

旧版本的 Apache Commons DBCP (即版本1.2)在高负载条件下存在一些讨厌的线程安全问题,因此不适合这种使用。我并不感到惊讶,雄猫的人重新工作,以解决这些问题。

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

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

Tomcat DBCP 只是 ApacheCommons 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)所替代。

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

  • 可以配置 ApacheCommons DBCP 来跟踪和恢复这些 废弃的数据库连接。不仅可以恢复它们,而且 为打开这些资源的代码生成堆栈跟踪 从没关过。

  • Tomcat jdbc-pool 库,在高度并发的场景中可能更快,但不能关闭和 自动发布语句(开发人员忘记关闭)导致 某些 jdbc 驱动程序中可能存在内存泄漏。

然而,DBCP 代码的一个问题是它们使用的委托模型,目前它们的最新版本支持 JDK1.6或更低版本。要支持1.7意味着至少要修改四分之一的类,这是 JDBC 池库出现的原因之一。

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

再补充一点: 我注意到一个有趣的行为,虽然它是预期的,但找不到任何文档说明:

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

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

下面列出了使用 TomcatJDBC 池而不是 commons-dbcp: http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html的优点

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

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”等等