stderr: org.springframework.dao.DataAccessResourceFailureException: could not inspect JDBC autocommit mode; nested exception is org.hibernate.exception.JDBCConnectionException: could not inspect JDBC autocommit mode
stderr: at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122)
stderr: at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
stderr: at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
stderr: at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.isAutoCommit(LogicalConnectionImpl.java:325)
stderr: at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
stderr: at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
stderr: at com.sun.proxy.$Proxy90.getResultList(Unknown Source)
stderr: at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:415)
stderr: at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
stderr: at org.postgresql.jdbc2.AbstractJdbc2Connection.getAutoCommit(AbstractJdbc2Connection.java:680)
stderr: at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108)
stderr: at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.isAutoCommit(LogicalConnectionImpl.java:322)
stdout: 00:00:00,002 ERROR SqlExceptionHelper:146 - This connection has been closed.
stderr: at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:221)
stderr: at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122)
stderr: at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
stderr: at sun.reflect.GeneratedMethodAccessor66.invoke(Unknown Source)
stderr: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
stderr: at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.isAutoCommit(LogicalConnectionImpl.java:325)
stderr: at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
stderr: at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:362)
stderr: at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
stderr: at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81)
stderr: at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.isAutoCommit(LogicalConnectionImpl.java:322)
stderr: at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
stderr: at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
stderr: at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
stderr: at com.sun.proxy.$Proxy86.findByTopicNameAndStatusOrderByTimeStampAsc(Unknown Source)
stderr: at java.lang.reflect.Method.invoke(Method.java:497)
stderr: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
stderr: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
stderr: at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.afterNonTransactionalQuery(TransactionCoordinatorImpl.java:199)
stderr: at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:67)
stderr: at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:110)
stderr: at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:74)
stderr: at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
stderr: at sun.reflect.GeneratedMethodAccessor60.invoke(Unknown Source)
stderr: at java.lang.reflect.Method.invoke(Method.java:497)
stderr: ... 48 more
细眼一看,关键词是
NO1.This connection has been closed
NO2.ScheduledThreadPoolExecutor
报错一直在定时任务运行时出现,调用数据库的时候,猜想是Pg数据库断了,询问运维查看数据库运行情况,回答是重启过,目前运行正常。
再次猜测是数据库重启导致服务连接异常,且并未重启连接,查阅BAIDU,获取的内容主要是以下2篇
http://www.itkeyword.com/doc/9437385695723670x776/postgres-connection-has-been-closed-error-in-spring-boot
https://stackoverflow.com/questions/31881250/heroku-postgres-this-connection-has-been-closed
发现Springboot并未做断接重连的配置。
1.先做对服务错误发生的验证,本地启动应用,在定时服务正常运行时,对pg数据库进行重启,果然,错误重现了。
2.于是对配置进行修改,增加一下内容:
#是否在自动回收超时连接的时候打印连接的超时错误
spring.datasource.log-abandoned=true
#是否自动回收超时连接
spring.datasource.remove-abandoned=true
#超时时间(以秒数为单位)
spring.datasource.remove-abandoned-timeout=180
##<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
spring.datasource.max-wait=1000
spring.datasource.test-while-idle=true
#检测数据库的查询语句
spring.datasource.validation-query=select 1
spring.datasource.test-on-borrow=true
#每隔五分钟检测空闲超过10分钟的连接
spring.datasource.min-evictable-idle-time-millis=600000
spring.datasource.time-between-eviction-runs-millis=300000
No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description ClusterDescription
{type=STANDALONE, connectionMode=MULTIPLE, all=[ServerDescription{address=10.2.130.179:8888, type=UNKNOWN, state=CONNECTING, exception=
{com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}]}. Waiting for 30000 ms before timing out
在数据库恢复之后,代码恢复正常运行。问题解决
引用配置地址:
http://blog.youkuaiyun.com/mr_phy/article/details/73323992