tomcat-dbcp vs commons-dbcp

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

以下是我想提出的一些观点…有人可以validation吗?

  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. 这两个唯一的区别可以在这个博客中find。 不知道信息是否正确。

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

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

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

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

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

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

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

TL / DR:这些都是一样的,不要使用它们中的任何一个。

Tomcat-dbcp是Tomcat发行版中包含的Apache公共库的原始重新包。 为避免类冲突,package被重命名为org.apache.tomcat.dbcp.dbcp。*

在Tomcat 7中(从2011年7月7日开始),默认的Tomcat包(作为tomcat-jdbc.jar的一部分)中包含了一个额外的连接池,作为名为“Tomcat JDBC连接池”的失效apache公共实现的替代方法:

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

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

不过,我的理解是,Commons DBCP 1.4修复了这些问题。 我无法亲自确认,但可能会导致Tomcat版本的冗余。

有趣的是,SpringSource还为其重新打包的Tomcat版本(tc-Server)重新编写了Commons DBCP,并声称它有很大的性能优势。 尽pipe如此,他们还没有开源。

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

  • Apache Commons DBCP可以configuration为跟踪和恢复这些废弃的数据库连接。 它不仅可以恢复它们,还可以为打开这些资源的代码生成一个堆栈跟踪,并且从不closures它们。

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

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

注意:进一步调查时,使用StatementFinalizer拦截器时,JDBC池确实可以在closures连接时closures打开语句。

只是在这里添加:我已经注意到一个有趣的行为,虽然它是预期的,但无法find任何文件:

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

Common DBCP和Tomcat DBCP的默认值有差异,特别是testOnBorrow (在Common DBCP中为false在Tomcat DBCP中为false )。

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