JDBC连接池的性能比较

时间:2009-05-07 16:11:49

标签: java performance jdbc connection-pooling

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

背景:我有一个应用程序在后台线程中运行db update到同一个盒子上的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池更少,也更大)。

5 个答案:

答案 0 :(得分:5)

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

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

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

(顺便说一下,这是我的另一个案例,我很高兴我只是编写自己的连接池代码;没有黑盒子神秘地吃着记忆,没有必要四处寻找“神奇参数”...)

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我弹出了mysql& c3p0也是 - 我尝试了各种各样的东西,最终让它消失了。我不记得了,但可能解决的是autoReconnect标志a la

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

  

管道损坏

这大致意味着另一方已中止/超时/关闭连接。你是不是保持长时间的联系?确保您的代码正确关闭finally块中的所有JDBC资源(ConnectionStatementResultSet)。

  

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

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