Java MySql connector/J中的autoReconnect和autoReconnectForPools之间有什么区别?

Java MySql connector/J中的autoReconnect和autoReconnectForPools之间有什么区别?,java,mysql,jdbc,apache-commons-dbcp,Java,Mysql,Jdbc,Apache Commons Dbcp,在MySql的配置参考中,对autoReconnect属性的使用发出了警告清空。我按照说明增加了服务器的等待超时时间。因为我正在使用DBCP,所以在阅读了Stackoverflow上的几篇文章后,我正在考虑转移到c3po,这篇文章是针对DBCP的,使用autoReconnectForPools属性可以吗?在DBCP或任何连接池下启用时,它实际上会做什么?autoReconnect将向客户端抛出一个SQLException,但会尝试重新建立连接 autoReconnectForPools将在每次S

在MySql的配置参考中,对autoReconnect属性的使用发出了警告清空。我按照说明增加了服务器的等待超时时间。因为我正在使用DBCP,所以在阅读了Stackoverflow上的几篇文章后,我正在考虑转移到c3po,这篇文章是针对DBCP的,使用autoReconnectForPools属性可以吗?在DBCP或任何连接池下启用时,它实际上会做什么?

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

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

在过去,我对dbcp有很多问题,尤其是断开连接。大多数问题都是通过搬到美国来解决的。请注意,mysql驱动程序具有c3p0 com.mysql.jdbc.integration.c3p0.MysqlConnectionTester的连接测试程序


此外,您可能还想查看以下内容:

您确定正确使用了DBCP吗

根据,它应该能够很好地处理超时,这要感谢默认值testOnBorrow=true在使用之前测试连接,如果失败,它将从池中删除,我们将尝试获得一个新的连接

您需要做的唯一一件事是确保将validationQuery属性配置为非空字符串,例如,为MySQL数据库选择0是关于每使用一个DB的不同validationQuery值的帖子。

MySQL的autoReconnect功能已被弃用,因为它有许多问题。请参阅:official

autoReconnectForPools与autoReconnect没有什么关系,它更多地与autoCommit和reconnectAtTxEnd有关-当所有3个都为真时,它将在每个事务结束时ping服务器,并在需要时自动重新连接

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


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

通常,HikariCP或Tomcat DBCP等更现代的池将使用Connection.isValid方法。还有一个只有MySQL才能识别的特殊查询,/*ping*/必须正好是这个查询,这将导致MySQL对服务器使用轻量级ping。我认为isValid实现应该更高效,因为/*ping*/查询仍然必须由解析器处理。