私はplayframeworkとmariadbクライアントを介してhikariプール接続を使用しており、それらを定期的に更新してから(play 2.6.5-> 2.6.6およびmariadb2.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)
関連する問題を見つけました ここ そしてidleTimeoutとmaxLifetimeを2分と5分に変更しようとしましたが、それでもエラーが発生しました。
HikariCP 2.7.1、play 2.6.6、mariadb-Java-client2.1.2を使用しています
maxLifetime
の値を変更してもこの問題を解決できなかったと書いていますが、実際にはうまくいったことに注意したいと思います。その値を590000
に設定すると、ログファイルから警告が削除されました。
クライアントのmaxLifetime
(ミリ秒単位)の値は、MySQLインスタンスのwait_timeout
(秒単位)の値よりも小さくする必要があります。このようにして、クライアントはデータベースが試行する前に常に接続を終了します。逆に、クライアントは閉じられた接続に基づいて動作しようとし、ログファイルに上記の警告が表示されます。
MySQLインスタンスのwait_timeout
値を確認するには、次のクエリを使用できます。
SHOW VARIABLES like '%timeout%';
MariaDBのデフォルトのmaxLifetime
値は28800
である必要がありますが、MySQL構成ファイルがロードされているため、600
を配置できることに気付きました。
maximum-pool-size
の50
を除いて、他の明示的な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