web-dev-qa-db-fra.com

La connexion à Db meurt après> 4 <24 en mode hibernation jpa

J'ai une application qui utilise spring-boot, jpa-hiberanate avec mysql.Je reçois ce journal d'erreurs

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.

Voici mon 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

Pour résoudre ce problème, je peux utiliser

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

Mais j'ai vérifié que ce n'était pas recommandé .Puis quelqu'un peut-il me suggérer ce que je dois faire pour surmonter cette erreur

41
Soham

La manière la plus simple consiste à spécifier la propriété autoReconnect dans l'URL JDBC, bien que ce ne soit pas l'approche recommandée.

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

Cela peut poser des problèmes lorsque vous avez une connexion active et pendant une transaction quelque chose se produit et une reconnexion va se produire. Il ne donnera pas de problèmes lorsque la connexion est validée au début de la transaction et qu'une nouvelle connexion est acquise au début.

Cependant, il est probablement préférable d'activer la validation de vos connexions pendant la durée de vie de votre application. Pour cela, vous pouvez spécifier plusieurs propriétés .

Commencez d'abord par spécifier le nombre maximal de connexions que vous autorisez pour le pool. (Pour une lecture sur la détermination de la taille maximale du pool, lisez this ).

spring.datasource.max-active=10

Vous pouvez également vouloir spécifier le nombre de connexions initiales

spring.datasource.initial-size=5

Ensuite, vous souhaitez spécifier le nombre minimum et maximum de connexions inactives.

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

Pour valider la connexion, vous devez spécifier une requête de validation et quand valider. Comme vous voulez le valider périodiquement, plutôt que lorsqu'une connexion est récupérée du pool (ceci pour éviter les connexions interrompues dans votre pool).

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

Maintenant que vous validez également lorsqu'une connexion est inactive, vous devez spécifier la fréquence à laquelle vous souhaitez exécuter cette requête pour les connexions et quand une connexion est considérée comme inactive.

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

Tout cela devrait déclencher la validation de vos connexions (inactives) et lorsqu'une exception se produit ou que la période d'inactivité est passée, vos connexions seront supprimées du pool.

En supposant que vous utilisez Tomcat JDBC comme pool de connexion this est une bonne lecture de quoi et comment configurer.

103
M. Deinum