9

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

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

** 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 池少得多,而且大得多)。

4

5 回答 5

5

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

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

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

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

于 2009-05-07T17:19:18.940 回答
3

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

于 2009-11-14T11:56:22.493 回答
1

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

url="jdbc:mysql://localhost:3306/database?autoReconnect=true"
于 2009-05-07T16:19:36.230 回答
1

你试过Apache DBCP吗?我不知道 c3po 但 DBCP 可以以不同的方式处理空闲连接:

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

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

于 2009-05-07T17:16:48.527 回答
0

断管

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

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

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

于 2009-11-14T12:48:37.800 回答