Spring Boot JPA: configuración de la reconexión automática

Resuelto stoffer asked hace 10 años • 9 respuestas

Tengo una pequeña y bonita aplicación web Spring Boot JPA. Se implementa en Amazon Beanstalk y utiliza Amazon RDS para datos persistentes. Sin embargo, no se utiliza con tanta frecuencia y, por lo tanto, falla después de un tiempo con este tipo de excepción:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: el último paquete recibido correctamente del servidor fue hace 79.870.633 milisegundos.
El último paquete enviado con éxito al servidor fue hace 79.870.634 milisegundos. es más largo que el valor configurado del servidor de 'wait_timeout'. Debería considerar expirar y/o probar la validez de la conexión antes de usarla en su aplicación, aumentar los valores configurados del servidor para los tiempos de espera del cliente o usar la propiedad de conexión del Conector/J 'autoReconnect=true' para evitar este problema.

No estoy seguro de cómo configurar esta configuración y no puedo encontrar información al respecto en http://spring.io (aunque es un sitio muy bueno). ¿Cuáles son algunas ideas o sugerencias de información?

stoffer avatar Mar 27 '14 17:03 stoffer
Aceptado

Supongo que boot está configurando el archivo DataSourcepor ti. En este caso, y como estás usando MySQL, puedes agregar lo siguiente a tu application.propertiesversión hasta 1.3

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

Como señaló djxak en el comentario, 1.4+ define espacios de nombres específicos para los cuatro grupos de conexiones que admite Spring Boot: tomcat, hikari, dbcp( dbcp2está dbcpobsoleto a partir de 1.5). Debe verificar qué grupo de conexiones está utilizando y verificar si esa función es compatible. El ejemplo anterior fue para Tomcat, por lo que tendrías que escribirlo de la siguiente manera en 1.4+:

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

autoReconnectTenga en cuenta que no se recomienda el uso de :

No se recomienda el uso de esta característica porque tiene efectos secundarios relacionados con el estado de la sesión y la coherencia de los datos cuando las aplicaciones no manejan las SQLExceptions correctamente, y solo está diseñada para usarse cuando no puede configurar su aplicación para manejar las SQLExceptions resultantes de conexiones muertas y obsoletas correctamente.

Stephane Nicoll avatar Mar 27 '2014 12:03 Stephane Nicoll

Las sugerencias anteriores no funcionaron para mí. Lo que realmente funcionó fue la inclusión de las siguientes líneas en application.properties

spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 3600000
spring.datasource.validationQuery = SELECT 1

Puedes encontrar la explicación aquí.

Soumya avatar Jan 11 '2016 14:01 Soumya