在MySql的connector J driver的配置参考中,会发出关于使用 autoReconnect 属性的警告。我按照说明操作,增加了服务器的 wait_timeout 。由于我正在使用DBCP(我正在考虑在阅读关于DBCP的Stackoverflow上的几篇帖子后转到c3po),是否可以使用 autoReconnectForPools 属性?在DBCP或任何连接池下启用时实际执行的操作是什么?
答案 0 :(得分:14)
autoReconnect会向客户端抛出SQLException,但会尝试重新建立连接。
autoReconnectForPools将在每次执行SQL之前尝试ping服务器。
过去我遇到过dbcp的很多问题,尤其是断开连接。大多数是通过转移到c3p0来解决的。请注意,mysql驱动程序具有c3p0的连接测试程序(com.mysql.jdbc.integration.c3p0.MysqlConnectionTester)。
此外,您可能需要查看此内容:Connection pooling options with JDBC: DBCP vs C3P0
答案 1 :(得分:7)
MySQL的autoReconnect
功能已被弃用,因为它有很多问题(参考:官方documentation)。
autoReconnectForPools
与autoReconnect
几乎没有关系,它更多地与autoCommit
和reconnectAtTxEnd
有关 - 当所有3个都是true
时,它会ping每个事务结束时的服务器,并在需要时自动重新连接。
DBCP的连接验证不完善 - 即使设置了testOnBorrow
,它有时会从池中返回断开的连接(更不用说在每次借用效率非常低之前测试连接)。
根据this article,HikariCP似乎是一个更好的池实现,因为它能够使用JDBC4 isValid()
API,它比运行测试查询快得多,并且专门设计为永不返回断开与客户端应用程序的连接。
答案 2 :(得分:1)
您确定正确使用DBCP吗?
根据short configuration notes,它应该可以很好地处理超时,这要归功于testOnBorrow=true
的默认值(在使用之前测试连接,如果失败,它将从池中删除,我们尝试取而代之的是新的。
您唯一需要做的是确保将validationQuery
属性配置为非空字符串,例如MySQL数据库的“SELECT 0”(here是关于每个DB使用的不同validationQuery值的帖子。)