web-dev-qa-db-ja.com

スプリングブートjpa休止状態で4 <24の後にDbへの接続が停止する

Mysqlでspring-boot、jpa-hiberanateを使用するアプリがあります。このエラーログが表示されます。

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 56,006,037 milliseconds ago.  The last packet sent successfully to the server was 56,006,037 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

ここに私のapplication.propertiesがあります

# DataSource settings: set here configurations for the database connection
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = test
spring.datasource.password = test
spring.datasource.driverClassName = com.mysql.jdbc.Driver

# Specify the DBMS
spring.jpa.database = MYSQL

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate settings are prefixed with spring.jpa.hibernate.*
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

この問題を解決するために、私は使用できます

spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1

しかし、私はそれが 推奨 ではないことを確認しました。だから誰もこのエラーを克服するために私がすべきことを私に提案できます

41
Soham

最も簡単な方法はJDBC URLでautoReconnectプロパティを指定することですが、これは推奨されるアプローチではありません。

spring.datasource.url = jdbc:mysql://localhost:3306/test?autoReconnect=true

これにより、アクティブな接続があり、トランザクション中に何かが発生し、再接続が発生する場合に問題が発生する可能性があります。トランザクションの開始時に接続が検証され、開始時に新しい接続が取得される場合、問題は発生しません。

ただし、おそらくアプリケーションの存続期間中に接続の検証を有効にする方が良いでしょう。このために、 いくつかのプロパティ を指定できます。

まず、プールに許可する接続の最大数を指定することから始めます。 (最大プールサイズの読み取りに関する読み取りについて this )。

spring.datasource.max-active=10

初期接続の数を指定することもできます

spring.datasource.initial-size=5

次に、アイドル接続の最小数と最大数を指定します。

spring.datasource.max-idle=5
spring.datasource.min-idle=1

接続を検証するには、検証クエリと検証するタイミングを指定する必要があります。接続がプールから取得されるときではなく、定期的に検証するため(プール内の接続の切断を防ぐため)。

spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=true
spring.datasource.validation-query=SELECT 1

接続がアイドル状態のときにも検証しているため、接続に対してこのクエリを実行する頻度と、接続がアイドル状態であると見なされるタイミングを指定する必要があります。

spring.datasource.time-between-eviction-runs-millis=5000 (this is the default)
spring.datasource.min-evictable-idle-time-millis=60000 (this is also default)

これはすべて(アイドル)接続の検証をトリガーし、例外が発生するか、アイドル期間が経過すると、接続がプールから削除されます。

Tomcat JDBCを接続プールとして使用していると仮定します this は、何をどのように構成するかをよく読んでいます。

103
M. Deinum