web-dev-qa-db-ja.com

Spring BootでPostgreSQLに自動的に再接続するにはどうすればよいですか?

PostgreSQLデータベースに接続するSpring Bootを実行しています。データベースの後にSpring Bootが開始された場合、データがデータベースに書き込まれることを確認しました。

spring.datasource.url = jdbc:postgresql://localhost/dbname
spring.datasource.username = user
spring.datasource.password = secret
spring.datasource.driver-class-name = org.postgresql.Driver
spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1

開発中のデータベースに変更があると、例外が発生します:PreparedStatementCallback; SQL []; This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.

例外が発生すると、データベースに再びアクセスできることに注意してください。問題は、元々接続していたデータベースエンドポイントが再起動のために使用できなくなったため、接続が古いことだと思います。 Spring Bootを再起動すると問題が解決します。

Spring Bootを再起動する必要がないように、PostgreSQLに再接続するように設定するにはどうすればよいですか?

Spring Boot JPA-自動再接続の設定 および spring jpaで接続が閉じた場合にデータベースを再接続する方法 の回答に従うことを試みました。 PostgreSQLの動作がMySQLと異なるかどうかはわかりません。 Spring Boot documentation を読んでも助けにはなりませんでした。どのドキュメントを参照すべきかを理解するのに十分なほど説明されたコンポーネントがわかりません。

14
mattm

スプリングブートは、自動的に再接続するように構成する必要があります。問題は、接続の切断が認識されないことです。

すでにボローと検証クエリでテストを使用しているため、毎回実行されるように検証間隔を減らしてみてください。

spring.datasource.Tomcat.test-on-borrow=true
spring.datasource.Tomcat.validation-query=SELECT 1
spring.datasource.Tomcat.validation-interval=0

Tomcat jdbc接続プール on testOnBorrow

(boolean)オブジェクトがプールから借用される前に検証されるかどうかの指示。オブジェクトの検証に失敗した場合、オブジェクトはプールから削除され、別のオブジェクトを借用しようとします。注-trueの値を有効にするには、validationQueryまたはvalidatorClassNameパラメーターをnull以外の文字列に設定する必要があります。 より効率的な検証を行うには、validationIntervalを参照してください。デフォルト値はfalseです

ただし、validationIntervalに注意してください。

(長い)過剰な検証を避け、この頻度でのみ検証を実行します-ミリ秒単位の時間。 接続が検証の対象であるが、この間隔内で以前に検証された場合、接続は再度検証されません。デフォルト値は30000(30秒) )。

8
rhorvath