2016-07-30 1 views
3

J'utilise le printemps-démarrage, printemps-JPA, mysql dans mon web application.When mon application est en cours d'exécution pendant quelques heures, j'ai toujours eu des exceptions ci-dessous:Comment reconnecter la base de données si la connexion est fermée au printemps jpa?

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] 

J'ai vérifié que la base de données fonctionne bien . Je dois redémarrer mon application de démarrage au printemps quand c'est arrivé. Comment puis-je vérifier quel est le problème? Pourquoi la connexion à la base de données s'est-elle fermée? Si c'est le cas, est-ce que je peux reconnecter la base de données? Ci-dessous mon 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 

Répondre

5

Cela semble être une erreur commune avec MySQL.

1) Ajouter à votre application.properties et voir comment ça se passe:

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

testOnBorrow est détaillée dans le spring doc et ce other stackoverflow question. Je suis cependant incapable de trouver une référence sur validationQuery dans le document de Spring, mais il semble faire l'affaire.

2) Ou, vous pouvez utiliser testWhileIdle comme suggéré ici http://christoph-burmeister.eu/?p=2849

Il suggère d'ajouter ceci à vos application.properties:

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

Cette solution est aussi dans l'mentionné autre stackoverflow question, ce n'était tout simplement pas la réponse acceptée, mais semble être la solution pour certains.

3) Dans ce cas, ils ont également ajouté timeBetweenEvictionRunsMillis:

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

EDIT: Une autre stackoverflow question qui couvre cette (avec une réponse très complète)