当前位置: 首页 > 知识库问答 >
问题:

psqlexception:此连接已关闭-Spring Boot+AWS RDS+Postgres

乐华晖
2023-03-14

在尝试访问AWS RDS中的Postgres数据库时,我正在获取psqlexception:此连接已关闭。异常是随机发生的(不是我运行代码的所有时间),如果在执行到达下面的代码之前需要一段时间,则更有可能发生:

@Transactional
public void revokeChanges(ArrayList<Integer> changeIds) {
    jdbcTemplate.batchUpdate(sqlUpdate,
            new BatchPreparedStatementSetter() {
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    ps.setStuff..
                    ...
                }
                @Override
                public int getBatchSize() {
                    return changeIds.size();
                }
            });
    jdbcTemplate.batchUpdate(sqlInsert,
            new BatchPreparedStatementSetter() {
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    ps.setStuff...
                }
                @Override
                public int getBatchSize() {
                    return changeIds.size();
                }
            });

连接材料:

spring.datasource.url=jdbc:postgreSQL://my-url:port/dbname?tcpkeepalive=true&autoreconnect=true

spring.datasource.driver-class-name=org.postgresql.driver

相关POM:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.9.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.3-1102-jdbc41</version>
    </dependency>
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.postgresql.util.PSQLException: This connection has been closed.
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:296)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:320)
    at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:214)
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:134)
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.(SQLErrorCodeSQLExceptionTranslator.java:97)
    at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:673)
    at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:989)
    at my.package.DataServiceJdbc.revokeChanges(DataServiceJdbc.java:71)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy24.revokeChanges(Unknown Source)
    at my.package.DataExporterS3ToPostgre.exportData(DataExporterS3ToPostgre.java:59)
    at my.package.Application.main(Application.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: org.postgresql.util.PSQLException: This connection has been closed.
    at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:843)
    at org.postgresql.jdbc4.Jdbc4Connection.getMetaData(Jdbc4Connection.java:54)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:80)
    at com.sun.proxy.$Proxy23.getMetaData(Unknown Source)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:285)
    ... 29 common frames omitted

共有1个答案

松飞翮
2023-03-14

看起来DB和池之间的连接丢失了。尝试设置RemoveAbanded和removeAbandonedTimeout选项。有关这些选项的更多数据,请阅读JDBC连接池文档。

 类似资料:
  • 我正在尝试使用Postgres数据库创建Hikari连接池。Hikari版本是3.4。1和postgres驱动程序版本为42.2。5. 我的连接属性如下。 mdb.hcp.driverClassName=org.postgresql.驱动程序 mdb。hcp。用户名=user1 mdb.hcp.jdbcUrl=jdbc:postgresql://localhost:2001/db1?ssl=fal

  • 我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)

  • 过了一会儿,我得到了这个错误,那么在给我的singleton之前,我如何确保连接没有死呢? 这是我的代码: 堆栈跟踪: java.sql。SQLException:此连接已关闭。在com.google.cloud.sql.jdbc.internal.Exceptions.newConnectionClosedException(exception.java:52)在com.google.cloud

  • 运行CRON JOB时,得到一个异常,说连接已经关闭。应用程序正在dropwizard上运行,以下是数据库配置 请帮助解决问题。

  • 我使用AWS DocumentDB作为我在node中开发的应用程序中的数据库。与MongoDB兼容的js。我已经使用MongoClient连接到我的数据库。我的应用程序会执行,但每次执行时会连接大约1000 DB的数据,然后会出现错误: 我尝试使用关闭连接,然后它给出连接池已关闭。我相信这个问题是由于太多的数据库连接造成的。 如何释放MongoDB中的连接?感谢任何帮助。

  • 我在springboot应用程序中使用webclient来调用外部restful web服务。间歇性地获取此异常。 在收到此异常之前,我在日志中看到以下警告。 这是完整的堆栈跟踪: 这是MessageServiceImpl.java 这里是客户端组件类 在下面的配置中,我在SSLContext中添加了信任存储。 下面是应用程序属性文件 我已经尝试通过下面链接中给出的解决方案来解决这个问题,但是没有