Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql使用Java应用程序发送到后端时发生I/O错误_Java_Postgresql_Amazon Rds_Amazon Aurora - Fatal编程技术网

Postgresql使用Java应用程序发送到后端时发生I/O错误

Postgresql使用Java应用程序发送到后端时发生I/O错误,java,postgresql,amazon-rds,amazon-aurora,Java,Postgresql,Amazon Rds,Amazon Aurora,我正在使用AmazonRDS服务托管一个PostreSql,作为Java应用程序的数据库。在应用程序启动后,它能够按预期执行查询,直到我停止交互几分钟并再次尝试执行任何查询为止。在该场景中,我得到以下异常: WARNING: Validating connection. org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. at org.postgresql.core.

我正在使用AmazonRDS服务托管一个PostreSql,作为Java应用程序的数据库。在应用程序启动后,它能够按预期执行查询,直到我停止交互几分钟并再次尝试执行任何查询为止。在该场景中,我得到以下异常:

WARNING: Validating connection.
org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:327)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:169)
    at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:136)
    at org.postgresql.jdbc.PgConnection.isValid(PgConnection.java:1311)
    at org.apache.commons.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:897)
    at org.apache.commons.dbcp2.PoolableConnection.validate(PoolableConnection.java:270)
    at org.apache.commons.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:630)
    at org.apache.commons.dbcp2.PoolableConnectionFactory.validateObject(PoolableConnectionFactory.java:648)
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:472)
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:349)
    at org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)
    at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:753)

Caused by: java.net.SocketException: Operation timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:140)
    at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:109)
    at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:67)
    at org.postgresql.core.PGStream.receiveChar(PGStream.java:288)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1962)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:300)
在Amazon RDS PostgreSQL上,我看到以下错误:

2020-04-09 19:01:11 UTC::[]:LOG: could not receive data from client: Connection timed out
2020-04-09 19:04:27 UTC::@:[]:LOG: checkpoint starting: time
2020-04-09 19:04:28 UTC::@:[]:LOG: checkpoint complete: wrote 1 buffers (0.0%); 0 WAL file(s) added, 0 removed, 1 recycled; write=0.143 s, sync=0.001 s, total=0.154 s; sync files=1, longest=0.001 s, average=0.001 s; distance=16377 kB, estimate=16396 kB
2020-04-09 19:08:15 UTC::LOG: could not receive data from client: Connection timed out

你知道如何解决这个问题吗?

我发现了一个潜在的问题,你的连接池中与postgres DB的连接可能会用尽,这可能是因为现有的连接可能在DB事务后无法关闭,并且没有被新的传入事务重新使用。尝试使用pgbouncer解决此问题。这是我的猜测看到您的日志

我猜您有一个(虚拟)网络组件,如路由器、负载均衡器、有状态防火墙等。它决定在X秒后可以删除您的连接,从而节省一些宝贵的内存。但是,这并没有通知双方TCP连接(数据库或Java应用程序),因此在一段时间后,他们会注意到彼此不再连接

如果您无法更改网络组件的行为,这些行为会自动终止您的连接,您可以从以下选项中选择:

  • 配置您的连接池(DBCP,如果您不喜欢,请切换到HikariCP)以在上述超时之前主动关闭空闲连接,请参阅以获取说明
  • 配置连接池以保持检查空闲连接的运行状况,这将使连接保持活动状态
  • 通过以下方式使用操作系统(TCP KeepAlive)中的TCP功能:

    • 使用:tcpKeepAlive=“true”通过JDBC驱动程序在套接字上启用此功能
    • 调整操作系统keepalive time设置以在超时前传输keepalive数据包,请参阅:或
  • 不要使用连接池(但这对性能有害,请参阅:)


  • 我以前曾经面对过这个问题,它让我发疯。最后,问题是因为防火墙在不通知后端的情况下停止任何空闲连接超过30分钟

    检查是否存在丢弃空闲连接的防火墙。我正在使用MAC进行开发,防火墙已关闭。请尝试执行netcat:e.g.
    nc myinstance.123456789012.us-east-1.rds.amazonaws.com 5432-v-v-z
    用于检查工作站是否可以连接到数据库。你成功了吗?您好,您使用的是什么框架?什么jdbc驱动程序,池?哪个版本。您可以发布关于数据库、jdbc的任何配置吗?可能是Apache Commons DBCP,版本?您调查过AWS PostgreSQL日志和系统日志吗?