Spring Boot JPA – configuración de reconexión automática

Tengo una bonita aplicación web de arranque de spring jpa. Se implementa en Amazon beanstalk y utiliza un rds de Amazon para datos persistentes. Sin embargo, no se utiliza con frecuencia y falla al cabo de un tiempo con este tipo de excepción:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 79,870,633 milliseconds ago. The last packet sent successfully to the server was 79,870,634 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. 

No estoy seguro de cómo configurar esta configuración y no puedo encontrar información sobre ella en http://spring.io (aunque es un sitio muy bueno). ¿Alguien tiene algunas ideas o consejos para la información?

Supongo que el arranque está configurando DataSource para usted. En este caso, y como está utilizando MySQL, puede agregar lo siguiente a su application.properties 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 pools de conexiones compatibles con Spring Boot: tomcat , hikari , dbcp , dbcp2 ( dbcp está en desuso desde 1.5). Debe verificar qué grupo de conexiones está utilizando y verificar si esa característica es compatible. El ejemplo anterior era 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 

Tenga en cuenta que no se recomienda el uso de autoReconnect :

No se recomienda el uso de esta función, ya que tiene efectos secundarios relacionados con el estado de la sesión y la coherencia de los datos cuando las aplicaciones no manejan SQLExceptions correctamente, y solo está diseñado para ser utilizado cuando no puede configurar su aplicación para manejar SQLExceptions resultante de conexiones muertas y viejas a tiempo.

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

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

Puedes encontrar la explicación aquí

Acabo de moverme a Spring Boot 1.4 y encontré que estas propiedades se renombraron:

 spring.datasource.dbcp.test-while-idle=true spring.datasource.dbcp.time-between-eviction-runs-millis=3600000 spring.datasource.dbcp.validation-query=SELECT 1 

Configuración spring.datasource.tomcat.testOnBorrow=true en application.properties no funcionó.

Configurar programáticamente como a continuación funcionó sin problemas.

 import org.apache.tomcat.jdbc.pool.DataSource; import org.apache.tomcat.jdbc.pool.PoolProperties; @Bean public DataSource dataSource() { PoolProperties poolProperties = new PoolProperties(); poolProperties.setUrl(this.properties.getDatabase().getUrl()); poolProperties.setUsername(this.properties.getDatabase().getUsername()); poolProperties.setPassword(this.properties.getDatabase().getPassword()); //here it is poolProperties.setTestOnBorrow(true); poolProperties.setValidationQuery("SELECT 1"); return new DataSource(poolProperties); } 

Tengo un problema similar. Spring 4 y Tomcat 8. Resuelvo el problema con la configuración Spring

      ...    

He probado. ¡Funciona bien! Esta dos líneas hace todo lo posible para volver a conectarse a la base de datos:

   

En caso de que alguien esté usando Custom DataSource

 @Bean(name = "managementDataSource") @ConfigurationProperties(prefix = "management.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); } 

Las propiedades deben verse como las siguientes. Observe las @ConfigurationProperties con el prefijo. El prefijo es todo antes del nombre de la propiedad real

 management.datasource.test-on-borrow=true management.datasource.validation-query=SELECT 1 

Una referencia para Spring Version 1.4.4.RELEASE

La respuesta de @whoami es la correcta usando las propiedades sugeridas, no pude hacer que esto funcione (usando el arranque de spring 1.5.3.RELEASE)

Estoy agregando mi respuesta ya que es una clase de configuración completa, por lo que podría ayudar a alguien que use la bota de resorte

 @Configuration @Log4j public class SwatDataBaseConfig { @Value("${swat.decrypt.location}") private String fileLocation; @Value("${swat.datasource.url}") private String dbURL; @Value("${swat.datasource.driver-class-name}") private String driverName; @Value("${swat.datasource.username}") private String userName; @Value("${swat.datasource.password}") private String hashedPassword; @Bean public DataSource primaryDataSource() { PoolProperties poolProperties = new PoolProperties(); poolProperties.setUrl(dbURL); poolProperties.setUsername(userName); poolProperties.setPassword(password); poolProperties.setDriverClassName(driverName); poolProperties.setTestOnBorrow(true); poolProperties.setValidationQuery("SELECT 1"); poolProperties.setValidationInterval(0); DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(poolProperties); return ds; } }