La conexión a Db muere después de >4<24 en hibernación jpa de arranque de primavera

Resuelto Soham asked hace 9 años • 1 respuestas

Tengo una aplicación que usa spring-boot,jpa-hiberanate con mysql. Recibo este registro de errores

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 56,006,037 milliseconds ago.  The last packet sent successfully to the server was 56,006,037 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.

Aquí está mi aplicación.properties

# DataSource settings: set here configurations for the database connection
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = test
spring.datasource.password = test
spring.datasource.driverClassName = com.mysql.jdbc.Driver

# Specify the DBMS
spring.jpa.database = MYSQL

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate settings are prefixed with spring.jpa.hibernate.*
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

Para resolver este problema puedo usar

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

Pero verifiqué que no es recomendado . Entonces, ¿alguien puede sugerirme qué debo hacer para superar este error?

Soham avatar May 26 '15 13:05 Soham
Aceptado

La forma más sencilla es especificar la autoReconnectpropiedad en la URL de JDBC, aunque este no es el enfoque recomendado.

spring.datasource.url = jdbc:mysql://localhost:3306/test?autoReconnect=true

Esto puede generar problemas cuando tiene una conexión activa y durante una transacción sucede algo y se va a volver a conectar. No dará problemas cuando se valide la conexión al inicio de la transacción y se adquiera una nueva conexión al inicio.

Sin embargo, probablemente sea mejor habilitar la validación de sus conexiones durante la vida útil de su aplicación. Para ello puede especificar varias propiedades .

Primero comience especificando el número máximo de conexiones que permite para el grupo. (Para obtener más información sobre cómo determinar el tamaño máximo del grupo, lea esto ).

spring.datasource.max-active=10

También es posible que desee especificar el número de conexiones iniciales.

spring.datasource.initial-size=5

A continuación, desea especificar el número mínimo y máximo de conexiones inactivas.

spring.datasource.max-idle=5
spring.datasource.min-idle=1

Para validar la conexión, debe especificar una consulta de validación y cuándo validar. Como desea validar periódicamente, en lugar de cuando se recupera una conexión del grupo (esto para evitar conexiones rotas en su grupo).

spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=true
spring.datasource.validation-query=SELECT 1

NOTA: En realidad, se desaconseja el uso de a validation-query, ya que JDBC4 tiene una forma mejor/diferente de realizar la validación de la conexión. HikariCP llamará automáticamente al método de validación JDBC cuando esté disponible.

Ahora que también está validando mientras una conexión está inactiva, debe especificar con qué frecuencia desea ejecutar esta consulta para las conexiones y cuándo una conexión se considera inactiva.

spring.datasource.time-between-eviction-runs-millis=5000 (this is the default)
spring.datasource.min-evictable-idle-time-millis=60000 (this is also default)

Todo esto debería activar la validación de sus conexiones (inactivas) y cuando ocurra una excepción o haya pasado el período de inactividad, sus conexiones se eliminarán del grupo.

Suponiendo que está utilizando Tomcat JDBC como grupo de conexiones, esta es una buena lectura de qué y cómo configurar.

ACTUALIZACIÓN: Spring Boot 2.x cambió el grupo de conexiones predeterminado a HikariCP en lugar de Tomcat JDBC.

M. Deinum avatar May 26 '2015 10:05 M. Deinum