notes example easy conectar con application java mysql spring spring-boot spring-jpa

java - example - Cómo volver a conectar la base de datos si la conexión se cerró en primavera jpa?



spring boot jpa (1)

Estoy usando spring-boot, spring-jpa, mysql en mi aplicación web. Cuando mi aplicación se ejecuta durante algunas horas, siempre tengo menos excepciones:

2016-07-30 21:27:12.434 ERROR 13553 --- [http-nio-8090-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper : No operations allowed after connection closed. 2016-07-30 21:27:12.434 WARN 13553 --- [http-nio-8090-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08003 2016-07-30 21:27:12.434 ERROR 13553 --- [http-nio-8090-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper : No operations allowed after connection closed. 2016-07-30 21:27:12.438 ERROR 13553 --- [http-nio-8090-exec-8] [.[.[.[.c.c.Go2NurseJerseyConfiguration] : Servlet.service() for servlet [com.cooltoo.config.Go2NurseJerseyConfiguration] in context with path [] threw exception [org.springframework.dao.DataAccessResourceFailureException: could not prepare statement; nested exception is org.hibernate.exception.JDBCConnectionException: could not prepare statement] with root cause java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3119) ~[mysql-connector-java-5.1.25.jar!/:na] at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3570) ~[mysql-connector-java-5.1.25.jar!/:na] at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3559) ~[mysql-connector-java-5.1.25.jar!/:na] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4110) ~[mysql-connector-java-5.1.25.jar!/:na] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) ~[mysql-connector-java-5.1.25.jar!/:na] at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) ~[mysql-connector-java-5.1.25.jar!/:na] at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815) ~[mysql-connector-java-5.1.25.jar!/:na] at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) ~[mysql-connector-java-5.1.25.jar!/:na] at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322) ~[mysql-connector-java-5.1.25.jar!/:na] at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82) ~[hibernate-core-4.3.11.Final.jar!/:4.3.11.Final]

He comprobado que la base de datos funciona bien. Tengo que reiniciar mi aplicación Spring-boot cuando eso sucedió. ¿Cómo puedo verificar cuál es el problema? ¿Por qué se cerró la conexión de la base de datos? Si eso sucedió, si puedo volver a conectar la base de datos? Debajo está mi application.properties:

spring.datasource.url=jdbc:mysql://192.168.99.100:3306/test?characterEncoding=utf8 spring.datasource.username=admin spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.max-active=150


Esto parece un error común con MySQL.

1) Agregue esto a su application.properties y vea cómo funciona:

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

testOnBorrow se detalla en el doc de primavera y esta otra pregunta de . Sin embargo, no puedo encontrar una referencia en validationQuery en el documento de Spring, pero parece ser el truco.

2) O bien, puede usar testWhileIdle como se sugiere aquí http://christoph-burmeister.eu/?p=2849

Él sugiere agregar esto a su aplicación. Propiedades:

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

Esta solución también se menciona en la otra pregunta de , simplemente no fue la respuesta aceptada, pero parece ser la solución para algunos.

3) En este caso, también agregaron timeBetweenEvictionRunsMillis :

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

EDITAR: Otra pregunta de que cubre esto (con una respuesta muy completa)