SpringBootアプリケーションとMySQLデータベースを起動するdocker-composeセットアップがあります。データベースが最初に起動した場合、アプリケーションは正常に接続できます。しかし、アプリケーションが最初に起動する場合、データベースはまだ存在しないため、アプリケーションは次の例外をスローして終了します。
app_1 | 2018-05-27 14:15:03.415 INFO 1 --- [ main]
com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
app_1 | 2018-05-27 14:15:06.770 ERROR 1 --- [ main]
com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization
app_1 | com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
Communications link failure
Docker-composeファイルを編集して、アプリケーションが起動する前にデータベースが常に稼働していることを確認できますが、アプリケーションがこのケースを単独で処理できるようにし、データベースアドレスに到達できない場合はすぐに終了しないようにします。
here および here と回答したように、application.propertiesファイルでデータソースを構成して、アプリケーションをデータベースに再接続する方法があります。しかし、それはデータソースへのスタートアップ接続では機能しません。
SpringBootアプリケーションがデータベースに正常に接続するまで、起動時にデータベースへの接続を一定の間隔で再試行するにはどうすればよいですか?
HikariCPのinitializationFailTimeout
プロパティを0(ゼロ)または負の数に設定します。記載されているように ここ :
⌚
initializationFailTimeout
このプロパティは、初期接続でプールに正常にシードできない場合に、プールが「速く失敗する」かどうかを制御します。正の数は、初期接続の取得を試みるミリ秒数と見なされます。この間、アプリケーションスレッドはブロックされます。このタイムアウトが発生する前に接続を取得できない場合、例外がスローされます。このタイムアウトは
connectionTimeout
期間の後に適用されます後。値がゼロ(0)の場合、HikariCPは接続の取得と検証を試みます。接続が取得されたが検証に失敗した場合、例外がスローされ、プールは開始されません。ただし、接続を取得できない場合、プールは起動しますが、後で接続を取得する試みは失敗する可能性があります。ゼロ未満の値は、最初の接続試行をバイパスし、プールはバックグラウンドで接続を取得しようとする間、すぐに開始します。その結果、後で接続を取得する試みが失敗する可能性があります。 デフォルト:1