JDBC连接池性能对比

Posted

技术标签:

【中文标题】JDBC连接池性能对比【英文标题】:Performance comparison of JDBC connection pools 【发布时间】:2010-10-24 13:14:35 【问题描述】:

有没有人有任何信息比较不同 ConnectionPool 实现的性能特征?

背景:我有一个应用程序在后台线程中运行数据库更新到同一个盒子上的 mysql 实例。使用数据源 com.mchange.v2.c3p0.ComboPooledDataSource 会给我们偶尔的 SocketExceptions: com.mysql.jdbc.CommunicationsException:由于底层异常导致通信链接失败:

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Broken pipe

STACKTRACE:

java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method)

增加 mysql 连接超时会增加这些错误的频率。

这些错误在切换到不同的连接池(com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource)时消失了;但是性能可能更差,内存配置文件也明显如此(我们得到的 GC 比 c3p0 池少得多,而且大得多)。

【问题讨论】:

【参考方案1】:

无论你使用什么连接池,你都需要假设连接可以随时被随机关闭,并让你的应用程序来处理它。

在“受信任”网络上存在长期数据库连接的情况下,经常发生的情况是操作系统对连接可以打开多长时间施加时间限制,或者定期运行一些“连接清理”代码。但原因并不重要——这只是网络生活的一部分,你应该假设连接可以“从你的脚下拉出来”,并相应地处理这种情况。

因此,我真的看不出连接池框架不允许您以编程方式处理这种情况的意义。

(顺便说一句,这是我的另一个案例,我很高兴我只是编写了自己的连接池代码;没有黑匣子神秘地吃掉内存,也不必四处寻找“神奇参数”......)

【讨论】:

【参考方案2】:

您可能想在http://jolbox.com 上查看一些基准测试数据 - 托管 BoneCP 的站点,这是一个比 C3P0 和 DBCP 都快的连接池。

【讨论】:

您答案中的链接不包含相关信息。 这是 10 多年前的链接。到目前为止,BoneCP 已被弃用多年。看看 HikariCP。【参考方案3】:

mysql 和 c3p0 也出现了这个错误——我尝试了各种方法,最终让它消失了。我不记得了,但可能已经解决的是自动重新连接标志

url="jdbc:mysql://localhost:3306/database?autoReconnect=true"

【讨论】:

谢谢,我确实找到了对此的引用,尽管它并没有解决我的问题。 +1 100 试试这个 - 由于 mysql 正在通过超时关闭连接,所以这个问题每一次都会对你的数据库进行 ping 操作,并且一段时间以保持连接活跃。【参考方案4】:

你试过Apache DBCP吗?我不了解 c3po,但 DBCP 可以通过不同方式处理空闲连接:

它可以从池中删除空闲连接 它可以在一段时间不活动后对空闲连接运行查询

它还可以在将连接提供给应用程序之前通过对其运行查询来测试连接是否有效;如果遇到异常,它会丢弃该连接并尝试使用另一个连接(或者如果可以,则创建一个新连接)。更加强大。

【讨论】:

除非在我们对 DBCP 进行压力测试后发生了很大变化,否则从commons.apache.org/dbcp/changes-report.html 判断,我们发现 DBCP 在性能和处理方面明显较差。你看过 Proxool 吗? 你能详细说明一下吗?我简要查看了 Proxool 并不清楚它是否是最新的,但除此之外我不熟悉它。您能否发布有关您的体验的更多详细信息作为完整答案?【参考方案5】:

断管

这大致意味着对方已经中止/超时/关闭了连接。你不是保持连接那么久吗?确保您的代码在 finally 块中正确关闭了所有 JDBC 资源(ConnectionStatementResultSet)。

增加 mysql 连接超时会增加这些错误的频率。

注意此超时不要超过数据库自己的超时设置。

【讨论】:

以上是关于JDBC连接池性能对比的主要内容,如果未能解决你的问题,请参考以下文章

JDBC插入优化性能对比

Hibernate三种连接池对比

单线程与线程池的性能对比

一般连接池是怎么处理mysql自动回收长时间

如今,使用 JDBC 的连接池是不是仍在提高性能?

数据库连接池 (DBCPc3p0Druid) 配置说明和对比