web-dev-qa-db-ja.com

データソースが利用可能になるまで接続を再試行するスプリング

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アプリケーションがデータベースに正常に接続するまで、起動時にデータベースへの接続を一定の間隔で再試行するにはどうすればよいですか?

10
Leonardo Nahra

HikariCPのinitializationFailTimeoutプロパティを0(ゼロ)または負の数に設定します。記載されているように ここ

initializationFailTimeout

このプロパティは、初期接続でプールに正常にシードできない場合に、プールが「速く失敗する」かどうかを制御します。正の数は、初期接続の取得を試みるミリ秒数と見なされます。この間、アプリケーションスレッドはブロックされます。このタイムアウトが発生する前に接続を取得できない場合、例外がスローされます。このタイムアウトはconnectionTimeout期間の後に適用されます。値がゼロ(0)の場合、HikariCPは接続の取得と検証を試みます。接続が取得されたが検証に失敗した場合、例外がスローされ、プールは開始されません。ただし、接続を取得できない場合、プールは起動しますが、後で接続を取得する試みは失敗する可能性があります。ゼロ未満の値は、最初の接続試行をバイパスし、プールはバックグラウンドで接続を取得しようとする間、すぐに開始します。その結果、後で接続を取得する試みが失敗する可能性があります。 デフォルト:1

5
brettw