web-dev-qa-db-ja.com

ひかり:接続が閉じているため、接続の検証に失敗しました

私は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を使用しています

5
Maxence Cramet

maxLifetimeの値を変更してもこの問題を解決できなかったと書いていますが、実際にはうまくいったことに注意したいと思います。その値を590000に設定すると、ログファイルから警告が削除されました。

クライアントのmaxLifetime(ミリ秒単位)の値は、MySQLインスタンスのwait_timeout(秒単位)の値よりも小さくする必要があります。このようにして、クライアントはデータベースが試行する前に常に接続を終了します。逆に、クライアントは閉じられた接続に基づいて動作しようとし、ログファイルに上記の警告が表示されます。

MySQLインスタンスのwait_timeout値を確認するには、次のクエリを使用できます。

SHOW VARIABLES like '%timeout%';

MariaDBのデフォルトのmaxLifetime値は28800である必要がありますが、MySQL構成ファイルがロードされているため、600を配置できることに気付きました。

maximum-pool-size50を除いて、他の明示的な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

4
Ostecke