有没有人有任何比较不同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池更少,也更大)。
答案 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资源(Connection
,Statement
和ResultSet
)。
增加mysql连接超时会增加这些错误的频率。
请注意此超时不超过数据库自己的超时设置。