2009-02-09 196 views
16

在MySql的​​的配置参考中,使用autoReconnect属性时发出警告emptor。我遵循指示,并增加了我的服务器的wait_timeout。由于我使用的DBCP(我正在考虑转移到c3po阅读Stackoverflow击落DBCP后的几个帖子),可以使用autoReconnectForPools属性吗?当在DBCP或任何连接池中启用时,它实际上做了什么?MySql连接器/ J中的autoReconnect和autoReconnectForPools有什么区别?

回答

10

autoReconnect会向客户端抛出一个SQLException,但会尝试重新建立连接。

autoReconnectForPools将尝试在每次执行SQL之前对服务器执行ping操作。

我在过去有很多dbcp的问题,尤其是断开连接。大部分通过转向c3p0解决。注意mysql驱动程序有c3p0的连接测试器(com.mysql.jdbc.integration.c3p0.MysqlConnectionTester)。

此外,你可能想看看这个:Connection pooling options with JDBC: DBCP vs C3P0

+0

谢谢你的想法。 – ashitaka 2009-04-03 01:44:34

1

你确定你使用正确DBCP?

根据short configuration notes,由于默认值为testOnBorrow=true(在使用前测试连接,并且如果失败,它会从池中删除,我们尝试获取新连接),因此应该处理超时时间相当不错。 。

您需要做的唯一事情是确保您将validationQuery属性配置为非空字符串,例如, MySQL数据库的“SELECT 0”(here是关于每个DB使用的不同validationQuery值的文章)。

5

MySQL的autoReconnect功能被弃用,因为它有很多问题(参考:官方documentation)。

autoReconnectForPools有一点做与autoReconnect,它更多的是与autoCommitreconnectAtTxEnd - 当所有3 true,它将ping服务器在每次交易结束,如果需要,自动重新连接。

DBCP的连接验证是不完美的 - 即使设置了testOnBorrow,它有时会从池中返回断开的连接(更不用说在每次借用之前测试连接都非常低效)。

根据this article,HikariCP似乎是一个更好的池实现,因为它能够使用比运行测试查询快得多的API,并且专门设计为永不返回到客户端应用程序的断开连接。

相关问题