解决Springboot运行时Postgrasql报错:ERROR SqlExceptionHelper:146 - This connection has been closed.

本文介绍了一个SpringBoot应用在使用PostgreSQL时遇到的连接关闭错误,并详细记录了解决过程,包括验证错误发生的步骤、配置修改及最终解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Springboot运行时,MQ突然报错:
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


3.再次在本地进行测试,启动定时服务,把数据库进行重启,结果是,在数据库关闭时,错误出现了,但是提示为

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

2025-03-26 09:29:04,343 - org.apache.skywalking.oap.server.telemetry.api.HealthCheckMetrics - 44 [pool-6-thread-1] ERROR [] - Health check fails org.h2.jdbc.JdbcSQLNonTransientConnectionException: The database has been closed [90098-212] at org.h2.message.DbException.getJdbcSQLException(DbException.java:678) ~[h2-2.1.212.jar:2.1.212] at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.212.jar:2.1.212] at org.h2.message.DbException.get(DbException.java:212) ~[h2-2.1.212.jar:2.1.212] at org.h2.engine.SessionLocal.getTransaction(SessionLocal.java:1596) ~[h2-2.1.212.jar:2.1.212] at org.h2.engine.SessionLocal.getStatementSavepoint(SessionLocal.java:1606) ~[h2-2.1.212.jar:2.1.212] at org.h2.engine.SessionLocal.setSavepoint(SessionLocal.java:848) ~[h2-2.1.212.jar:2.1.212] at org.h2.command.Command.executeUpdate(Command.java:244) ~[h2-2.1.212.jar:2.1.212] at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:209) ~[h2-2.1.212.jar:2.1.212] at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:169) ~[h2-2.1.212.jar:2.1.212] at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-3.1.0.jar:?] at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-3.1.0.jar:?] at org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient.executeUpdate(JDBCHikariCPClient.java:97) ~[library-client-9.4.0.jar:9.4.0] at org.apache.skywalking.oap.server.storage.plugin.jdbc.common.dao.JDBCHistoryDeleteDAO.deleteHistory(JDBCHistoryDeleteDAO.java:68) ~[storage-jdbc-hikaricp-plugin-9.4.0.jar:9.4.0] at org.apache.skywalking.oap.server.core.storage.ttl.DataTTLKeeperTimer.execute(DataTTLKeeperTimer.java:109) ~[server-core-9.4.0.jar:9.4.0] at java.util.ArrayList.forEach(ArrayList.java:1541) ~[?:?] at org.apache.skywalking.oap.server.core.storage.ttl.DataTTLKeeperTimer.delete(Data
03-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值