tomcat-dbcp vs commons-dbcp

rab*_*bit 68 java apache-commons apache-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文档清楚地提到大多数类刚刚被重新命名和重新打包.

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

Flo*_*ume 35

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)取代.

  • 这是真的吗?[Tomcat DBCP文档的第一部分](http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#Introduction)声称两者之间存在大量差异. (18认同)
  • 我编辑了我的答案,添加了有关池故事的说明. (2认同)

Pav*_*vel 15

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

TL/DR:这些是相同的,不要使用它们中的任何一个.

Tomcat-dbcp是Tomcat发行版中包含的apache commons池的原始重新包.为避免类冲突包被重命名为org.apache.tomcat.dbcp.dbcp.*

在Tomcat 7中(从2011年7月的7.0.19开始),默认的Tomcat包中包含了一个额外的连接池(作为tomcat-jdbc.jar的一部分),作为stale 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:这些是相同的,不要使用它们中的任何一个`与`简短摘要为什么新的Tomcat池更好? (2认同)

ska*_*man 11

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

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

有趣的是,SpringSource还为他们重新打包的Tomcat版本(tc-Server)重写了Commons DBCP,并且声称它们具有很大的性能优势.但他们并没有开源.

  • DBCP 1.4比1.2提高了性能,自从我升级以来,我没有再遇到任何死锁或线程安全问题. (4认同)

小智 6

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

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

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

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

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