71

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

以下是我想提出的一些观点......有人可以验证吗?

  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 官方文档清楚地提到,大多数类刚刚被重新命名和重新打包。

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

4

6 回答 6

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)所取代。

于 2012-04-25T16:02:44.460 回答
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”等
于 2015-03-25T06:38:43.960 回答
11

旧版本的 Apache Commons DBCP(即 1.2 版)在高负载条件下存在一些令人讨厌的线程安全问题,使其不适合这种用途。Tomcat 的人重新设计它来解决这些问题并不让我感到惊讶。

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

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

于 2011-01-17T10:55:21.893 回答
6

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

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

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

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

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

于 2012-11-24T12:42:59.623 回答
4

只是在这里添加:我注意到一个有趣的行为,虽然这是预期的,但找不到任何文档:

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

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

于 2013-02-15T18:31:01.513 回答
4

以下是使用 Tomcat JDBC 池而不是 commons-dbcp 的优势列表:http: //people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

于 2013-03-13T14:35:22.423 回答