DBCP(Apache Commons 数据库连接池)是不是仍然相关?

Posted

技术标签:

【中文标题】DBCP(Apache Commons 数据库连接池)是不是仍然相关?【英文标题】:Is DBCP (Apache Commons Database Connection Pooling) still relevant?DBCP(Apache Commons 数据库连接池)是否仍然相关? 【发布时间】:2010-10-04 04:01:17 【问题描述】:

JDBC 3.0 规范谈到了连接(和准备好的语句)池。

我们有几个独立的 Java 程序(即我们不使用应用程序服务器)一直在使用 DBCP 来提供连接池。我们应该继续使用 DBCP,还是可以利用 JDBC 提供的池化并摆脱 DBCP?

我们正在使用 mysql (Connector/J),最终将添加 SQL Server 支持 (jTDS);我们不太可能支持任何其他数据库。

编辑:请参阅下面关于我尝试消除连接池库的评论。似乎 DBCP 仍然相关(请注意,一些评论者推荐 C3P0 而不是 DBCP)。

【问题讨论】:

【参考方案1】:

在其他发帖人的鼓励下,我尝试去掉DBCP,直接使用MySQL JDBC驱动(Connector/J 5.0.4)。我无法这样做。

看起来,虽然驱动程序确实为池提供了基础,但它并没有提供最重要的东西:一个实际的池(源代码为此派上了用场)。这部分由应用服务器提供。

我又查看了 JDBC 3.0 文档(我有一份标有“第 11 章连接池”的打印副本,不确定它的确切来源),我可以看到 MySQL 驱动程序遵循 JDBC 文档。

当我查看 DBCP 时,这个决定开始变得有意义。良好的游泳池管理提供了许多选择。例如,您何时清除未使用的连接?你清除了哪些连接?池中的最大连接数是否有硬性或软性限制?在将连接提供给呼叫者之前,您是否应该测试连接的“活跃性”?等等

总结:如果你在做一个独立的 Java 应用程序,你需要使用一个连接池库。连接池库仍然有用。

【讨论】:

【参考方案2】:

DBCP 存在严重缺陷。我认为它不适合生产应用程序,尤其是当有这么多驱动程序在其 DataSource 原生支持池时。

就我而言,压垮骆驼的最后一根稻草是当我发现整个池在对数据库进行新连接尝试的整个过程中都被锁定时。因此,如果您的数据库发生导致连接缓慢或超时的问题,其他线程在尝试将连接返回到池时会被阻止——即使它们是使用数据库完成的。

池旨在提高性能,而不是降低性能。 DBCP 幼稚、复杂且过时。

【讨论】:

从 DBCP 切换到 JDBC 池需要付出多大的努力? 这取决于驱动程序。使用 Oracle 和 PostgresQL,这是一个简单的配置更改——代码已经在使用 (DBCP) 数据源。我没有使用 MySQL 驱动程序的经验。 我同意 DBCP 已损坏。我们切换到 C3PO,它的工作就像做梦一样 同样的问题也适用于 C3PO - 它仍然相关吗? 我们已经将 DBCP 与 Spring 一起使用了大约 4 年,没有出现任何问题 - 也许我们很幸运!【参考方案3】:

我更喜欢使用 dbcp 或 c3p0,因为它们是供应商中立的。我发现,至少在使用 mysql 或 oracle 时,每当我尝试使用非标准 sql 的 jdbc 客户端做某事时,我都必须引入对供应商类的编译时依赖。例如,看一个非常烦人的例子here。

我不确定 mysql,但 oracle 使用它们特定的非标准类进行连接池。

【讨论】:

我知道。我引用它来说明我对编译依赖项的意思。【参考方案4】:

人们仍然使用 DBCP,我认为它甚至是 Hibernate 的默认设置。

DBCP 是否不能满足您当前的需求?

我不太相信替换基础架构,除非已经存在无法填补的性能或功能差距,即使周围有更新或更好的替代方案。

【讨论】:

DBCP 可以工作,但如果我可以从 JDBC 驱动程序中获得相同的功能,我会尽快简化事情。我也不介意删除我们为“修复”DBCP 异常处理而添加的一些代码。

以上是关于DBCP(Apache Commons 数据库连接池)是不是仍然相关?的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接池技术

JDBC 学习复习7 学习 Apache 开源DBCP 数据源

commons dbcp.jar有什么用

DBCP

DBCP连接池

解决dbcp数据库连接池错误