【问题标题】:tomcat-dbcp vs commons-dbcptomcat-dbcp 与 commons-dbcp
【发布时间】:2011-06-10 08:41:57
【问题描述】:

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

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

  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. 这两者之间的唯一区别可以在this blog 中找到。不知道信息是否正确。

  4. The official Tomcat documentation 明确提到大多数类刚刚被重新命名和重新打包。

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

【问题讨论】:

  • 到目前为止,在我遇到的所有 Tomcat 安装中,tomcat-dbcp.jar 确实 存在,commons-dbcp.jar 是 Tomcat lib 目录的一部分。也就是说,直到上周有人从 ASF 网站下载了 Tomcat 并尝试运行它。所以,肯定很奇怪。

标签: java apache-commons apache-commons-dbcp


【解决方案1】:

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

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

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

【讨论】:

  • DBCP 1.4 比 1.2 有了很大的性能改进,自从我升级以来,我没有遇到任何死锁或线程安全问题。
  • @Chochos:很高兴知道。这是什么类型的应用程序?
  • 一个事务性交换机,每天执行 200K+ 次操作。大量简短的 1-5 行查询,大量更新和插入。
【解决方案2】:

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 pool(包org.apache.tomcat.jdbc.pool)替换。

【讨论】:

  • 这是真的吗? The very first section of Tomcat DBCP docs 声称两者之间存在大量差异。
  • 我编辑了答案以添加关于泳池故事的说明。
  • pomlottc 的链接指向 Tomcat JDBC 连接池 (org.apache.tomcat.jdbc.pool),它是一个单独的库
  • @FlorentGuillaume 当你说“在 Tomcat 池的实现被 Tomcat 自己的 JDBC 池替换”时,你指的是 tomcat 重新打包的 dbcp 这样做吗?
  • @Marplesoft 不,我指的是 Tomcat 现在使用的新池实现 jdbc-pool。该链接解释了为什么现在使用它。
【解决方案3】:

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 的默认值之间存在差异,特别是 testOnBorrow(Common DBCP 为 true,Tomcat DBCP 为 false)。

    【讨论】:

      【解决方案5】:

      这里列出了使用 Tomcat JDBC 池而不是 commons-dbcp 的优势:http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 惊人的解释!!
        • 这令人困惑:TL/DR: these are the same, don't use either of themShort summary why new Tomcat pool is better
        猜你喜欢
        • 2013-09-04
        • 2012-07-24
        • 2019-02-10
        • 1970-01-01
        • 2012-09-24
        • 2011-06-26
        • 2014-05-19
        • 2012-04-29
        • 1970-01-01
        相关资源
        最近更新 更多