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" />