Tengo una pequeña aplicación web Spring Boot JPA. Se implementa en Amazon Beanstalk y utiliza un RDS de Amazon para la persistencia de datos. Sin embargo, no se usa 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 por el servidor de 'wait_timeout'. Debe considerar la caducidad y / o probar la validez de la conexión antes de usarla en su aplicación, aumentar los valores configurados por el servidor para los tiempos de espera del cliente o usar la propiedad de conexión Connector / J 'autoReconnect = true' para evitar este problema.
No estoy seguro de cómo configurar este ajuste 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?
fuente
DataSource
y verificar sus propiedades. stackoverflow.com/a/36586630/148844 Spring Boot no configurará automáticamente elDataSource
si tiene alguno@Beans
que defina unDataSource
. docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/…Respuestas:
Supongo que boot está configurando el
DataSource
para usted. En este caso, y dado que está utilizando MySQL, puede agregar lo siguiente a suapplication.properties
hasta 1.3Como djxak observó en el comentario, 1.4+ define los espacios de nombres específicos para las cuatro piscinas conexiones soportes de muelle de arranque:
tomcat
,hikari
,dbcp
,dbcp2
(dbcp
está en desuso como de 1,5). Debe verificar qué grupo de conexiones está utilizando y verificar si esa función es compatible. El ejemplo anterior era para tomcat, por lo que tendría que escribirlo de la siguiente manera en 1.4+:Tenga en cuenta que el uso de
autoReconnect
está no recomienda :fuente
spring.datasource.testOnBorrow
yspring.datasource.test-on-borrow
funciona muy bien. Consulte la documentación para obtener más detalles.SELECT 1
garantiza que la conexión ha sido probada antes de entregarla a la aplicación. Al usarlostestOnBorrow = true
, los objetos se validarán antes de tomarlos prestados del grupo. Si el objeto no se valida, se eliminará del grupo e intentará tomar prestado otro. NOTA - para que un valor verdadero tenga algún efecto, el parámetro validationQuery debe establecerse en una cadena no nula.tomcat
,hikari
,dbcp
,dbcp2
. Entonces, por ejemplo, paratomcat-jdbc
el pool de conexiones, las propiedades deberían ser:spring.datasource.tomcat.testOnBorrow=true
yspring.datasource.tomcat.validationQuery=SELECT 1
.If you define your own DataSource bean, auto-configuration will not occur.
Seguí una guía para OAuth2@Bean(name = "OAuth") public DataSource secondaryDataSource()...
y no se configuró ni se usó automáticamentetestOnBorrow
.Las sugerencias anteriores no funcionaron para mí. Lo que realmente funcionó fue la inclusión de las siguientes líneas en la aplicación.
Puedes encontrar la explicación aquí
fuente
Ajuste
spring.datasource.tomcat.testOnBorrow=true
en application.properties no funcionó.La configuración programática como a continuación funcionó sin ningún problema.
fuente
Me acabo de mudar a Spring Boot 1.4 y descubrí que estas propiedades cambiaron de nombre:
fuente
La respuesta de Whoami es la correcta. Usando las propiedades como se sugirió, no pude hacer que esto funcione (usando Spring Boot 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 Spring Boot:
fuente
Tengo un problema similar. Spring 4 y Tomcat 8. Soluciono el problema con la configuración de Spring
He probado. ¡Funciona bien! Esta dos línea hace todo lo posible para volver a conectarse a la base de datos:
fuente
En caso de que alguien esté usando una fuente de datos personalizada
Las propiedades deben tener el siguiente aspecto. Observe las @ConfigurationProperties con prefijo. El prefijo es todo antes del nombre real de la propiedad.
Una referencia para Spring Version 1.4.4.
fuente
Como ya señalaron algunas personas, spring-boot 1.4+, tiene espacios de nombres específicos para los cuatro grupos de conexiones. Por defecto, hikaricp se usa en spring-boot 2+. Entonces, tendrá que especificar el SQL aquí. El valor predeterminado es
SELECT 1
. Esto es lo que necesitaría para DB2, por ejemplo:spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1
Advertencia : si su controlador es compatible con JDBC4, le recomendamos encarecidamente que no configure esta propiedad. Esto es para controladores "heredados" que no son compatibles con la API JDBC4 Connection.isValid (). Esta es la consulta que se ejecutará justo antes de que se le proporcione una conexión desde el grupo para validar que la conexión a la base de datos aún está activa. Nuevamente, intente ejecutar el grupo sin esta propiedad, HikariCP registrará un error si su controlador no es compatible con JDBC4 para informarle. Por defecto: ninguno
fuente
Para aquellos que quieran hacerlo desde YAML con múltiples fuentes de datos, hay una excelente publicación de blog al respecto: https://springframework.guru/how-to-configure-multiple-data-sources-in-a-spring-boot -solicitud/
Básicamente dice que ambos deben configurar las propiedades de la fuente de datos y la fuente de datos de esta manera:
No olvide eliminar
@Primary
de otras fuentes de datos.fuente