2017-10-12 2 views
0

Souvent, je dois redémarrer un microservice parce que j'obtiens une exception DataAccessResourceFailureException et JDBCConnectionException après un certain temps (6-12 heures) (j'ai inséré la pile ci-dessous). J'utilise les données de printemps et la DB est AWS RDSJDBCConnectionException parfois avec les données printanières et amazon RDS

Voici un extrait de mon fichier de configuration que je pensais résoudre le problème

spring.datasource.dbcp2.validation-query= SELECT 1 spring.datasource.dbcp2.test-while-idle= true spring.datasource.dbcp2.test-on-borrow= true spring.datasource.dbcp2.time-between-eviction-runs-millis= 5000

[E] s.s.s.TaskUtils$LoggingErrorHandler: Unexpected error occurred in scheduled task. 
org.springframework.dao.DataAccessResourceFailureException: could not prepare statement; nested exception is org.hibernate.exception.JDBCConnectionException: could not prepare statement 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:257) 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:488) 
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) 
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) 
Caused by: org.hibernate.exception.JDBCConnectionException: could not prepare statement 
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 
    at sun.reflect.GeneratedConstructorAccessor80.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) 
    at com.mysql.jdbc.Util.getInstance(Util.java:408) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 39,231,404 milliseconds ago. The last packet sent successfully to the server was 39,231,405 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. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) 
Caused by: java.net.SocketException: Connection timed out (Write failed) 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) 

Répondre

0

DataAccessResourceFailureException -> exception d'accès aux données jeté quand une ressource échoue complètement, par exemple: si nous ne pouvons pas nous connecter à une base de données en utilisant JDBC.Mon soupçon est que nous obtenons l'erreur due à la connexion.

Veuillez essayer de regarder les journaux de RDS.

Et aussi ce que je comprends du journal est MySQLNonTransientConnectionException. Donc, ce qui est dû à l'abandon de la connexion de la piscine après le délai d'attente. Donc, la meilleure option est de configurer le timeout, le temps d'expulsion est plus long. Mais ce que votre application est en train de faire est correct et il n'est pas recommandé d'avoir plus de temps d'expiration ou d'expulsion

+0

https://stackoverflow.com/questions/2297356/mysqlnontransientconnectionexception-in-jdbc-program-at-run-time aussi cette question répondra à votre question avec précision. – venkatReddi