19

在 MySql 的连接器 J 驱动程序的配置参考中,对使用autoReconnect属性发出警告购买者。我按照说明增加了服务器的wait_timeout。由于我使用的是 DBCP(在阅读了有关 Stackoverflow 击落 DBCP 的几篇文章后,我正在考虑转移到 c3po),可以使用autoReconnectForPools属性吗?在 DBCP 或任何连接池下启用它实际上会做什么?

4

3 回答 3

16

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

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

过去我在使用 dbcp 时遇到过很多问题,尤其是断开连接。大多数都通过转移到c3p0得到解决。请注意,mysql 驱动程序具有 c3p0 (com.mysql.jdbc.integration.c3p0.MysqlConnectionTester) 的连接测试器。

此外,您可能需要查看:使用 JDBC 的连接池选项:DBCP vs C3P0

于 2009-04-02T14:34:31.893 回答
9

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

autoReconnectForPools与 几乎没有关系autoReconnect,更多的是与autoCommit-reconnectAtTxEnd当所有 3 个都是时true,它将在每个事务结束时 ping 服务器,并在需要时自动重新连接。

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

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

于 2015-04-06T19:07:15.790 回答
2

您确定您正确使用 DBCP 吗?

根据简短的配置说明,它应该可以很好地处理超时,这要归功于默认值testOnBorrow=true(在使用之前测试连接,如果连接失败,它将从池中删除,我们尝试获取一个新连接)。

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

于 2012-06-06T05:32:42.823 回答