mkyong example ejemplo data application spring configuration spring-boot spring-jpa

example - Spring Boot JPA-configuración de reconexión automática



spring jpa configuration (7)

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

Tengo una bonita aplicación web de arranque de primavera 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?


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); }


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 primavera 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; } }


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 here


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.


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

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> <property name="initialSize" value="10" /> <property name="maxActive" value="25" /> <property name="maxIdle" value="20" /> <property name="minIdle" value="10" /> ... <property name="testOnBorrow" value="true" /> <property name="validationQuery" value="SELECT 1" /> </bean>

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

<property name="testOnBorrow" value="true" /> <property name="validationQuery" value="SELECT 1" />