我通过play框架和mariadb客户端使用hikari pool连接,自从我定期更新它们(play 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
2条答案
按热度按时间368yc8dk1#
虽然您写道,通过更改
maxLifetime
值无法成功解决此问题,但我想指出,它实际上对我有效。将其值设置为590000
已从我的日志文件中删除了警告。客户端的
maxLifetime
(毫秒)值应该小于MySQL示例的wait_timeout
(秒)值。这样客户端将总是在数据库尝试之前终止连接。相反,客户端将尝试对关闭的连接进行操作,您将在日志文件中获得上述警告。要查看MySQL示例的
wait_timeout
值,可以使用以下查询:SHOW VARIABLES like '%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
fnx2tebb2#
尝试配置“keepaliveTime”配置。
spring.datasource.hikari.keepaliveTime=240000
https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby