原因
MySQLの起動完了前に、SpringBootが初期接続を試みて失敗していた
環境
- SpringBoot : 2.1.7.RELEASE
- MySQL : 8.0.17
- Docker : 19.03.2
- docker-compose : 1.24.1
- compose-file : 3.7
対応
application.yml
にDB初期接続時のTimeOutの設定を追加
spring:
datasource:
hikari:
initializationFailTimeout: 0
上記はコネクションプールライブラリにHikariCPを使用している場合の設定
hikari
以降のkey
は使用しているライブラリによって異なる
※コネクションプールの設定は以下の記事を参考にさせて頂きました
Spring Boot DBコネクションプール
initializationFailTimeoutを0に設定するとどうなるか
HikariCPのREADMEによると
If the value is zero (0), HikariCP will attempt to obtain and validate a connection. If a connection is obtained, but fails validation, an exception will be thrown and the pool not started. However, if a connection cannot be obtained, the pool will start, but later efforts to obtain a connection may fail.
値に0
を設定した場合、接続を試み、検証を行う。コネクションを獲得したが、検証に失敗した場合、例外を投げ、プールは開始しない。しかしながら、コネクションを獲得できない場合でもプールは開始される。ただし、後からコネクションを獲得しようとしても失敗する可能性がある。
とのこと。
ちなみに
はじめはdocker-compose.yml
でdepends_on
を書いておけば、mysqlが利用可能になってからアプリケーションがスタートするものと思っていたが、Docker-docsによるとそうではなく、データベースが起動していない場合の対処はアプリ側で再接続処理を入れるなどして責任を持つべきとのこと