我正在通过播放框架和 mariadb 客户端使用 hikari 池连接,因为我已经定期更新它们(播放 2.6.5 -> 2.6.6 和 mariadb 2.1.1 -> 2.1.2 但不确定它是否相关)我遇到以下错误:
HikariPool-1 - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@31124a47 (Connection.setNetworkTimeout cannot be called on a closed connection)
at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:184)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:172)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:146)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:85)
at play.api.db.DefaultDatabase.getConnection(Databases.scala:142)
at play.api.db.DefaultDatabase.withConnection(Databases.scala:152)
at play.api.db.DefaultDatabase.withConnection(Databases.scala:148)
我发现了一个相关问题 here并尝试将 idleTimeout 和 maxLifetime 更改为 2 分钟和 5 分钟,但错误仍然发生。
我正在使用 HikariCP 2.7.1、play 2.6.6 和 mariadb-java-client 2.1.2
最佳答案
尽管您写道您无法通过更改 maxLifetime
值成功解决此问题,但我想指出它实际上对我有用。将其值设为 590000
已从我的日志文件中删除了警告。
客户端的 maxLifetime
(以毫秒为单位)值应小于 MySQL 实例的 wait_timeout
(以秒为单位)值。这样,客户端将始终在数据库尝试之前终止连接。相反,客户端将尝试对关闭的连接采取行动,您将在日志文件中收到上述警告。
要查看 MySQL 实例的 wait_timeout
值,您可以使用以下查询:
显示像“%timeout%”这样的变量;
MariaDB 的默认 maxLifetime
值应该是 28800
,但我注意到 600
可以到位,因为正在加载 MySQL 配置文件.
我应该注意,除了 50
的 maximum-pool-size
之外,我没有其他明确的 hikari 配置。
我的灵感来自:https://github.com/brettwooldridge/HikariCP/issues/856顺便一提。其他非常有用的资源是:https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby和 https://mariadb.com/kb/en/library/server-system-variables/#wait_timeout
关于java - 光 : Failed to validate connection because connection is closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46830159/