java - PostgreSQL 异常 : org. postgresql.util.PSQLException:发送到后端时发生 I/O 错误

标签 java sql postgresql amazon-web-services

我知道这是一个重复的问题。但我找不到相同的解决方案。

我已将我的应用程序托管在 Amazon EC2 云中。 我正在使用 postgresql 。

我在 Amazon cloud 中运行我的应用程序时遇到异常 org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. .

详细的堆栈跟踪是:

org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:281)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:403)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:331)
    at com.spy2k3.core.business.processor.ProcessorImpl.executeUpdate(ProcessorImpl.java:237)
    at com.spy2k3.core.business.object.BusinessObject.executeUpdate(BusinessObject.java:54)
    at com.spy2k3.core.business.object.LoginObject.deleteSession(LoginObject.java:127)
    at com.spy2k3.core.business.processor.LoginProcessor.userValidation(LoginProcessor.java:79)
    at com.spy2k3.core.business.processor.LoginProcessor.execute(LoginProcessor.java:30)
    at com.spy2k3.core.business.processor.ProcessorImpl.process(ProcessorImpl.java:73)
    at com.spy2k3.core.handler.request.RequestHandler.doService(RequestHandler.java:90)
    at com.spy2k3.core.handler.AbstractHandler.doPost(AbstractHandler.java:25)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.SocketException: Socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:143)
    at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:112)
    at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:71)
    at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:269)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1700)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    ... 37 more

测试:

1.我从我的本地系统通过 PgAdmin 连接了我的远程 postgresql 服务器,我可以连接并执行查询。

2.我通过 putty 连接到我的远程服务器,并且可以成功执行查询。 示例:

    [root@ip-xx-xxx-xx-xxx bin]# psql -U myuser -d mydatabase
    psql (9.2.4)
    Type "help" for help.

mydatabase=# SELECT USERID FROM MY_MAST_LOGINSESSION WHERE SESSIONID='5DFD5D1E09D523695D6057SOMETHING';
 userid
--------
(0 rows)

3。当我从我的应用程序通过 jdbc 连接我的远程数据库时,它成功连接,但是在那里执行查询花费了太多时间。

你能建议任何解决方案来找出这个时间延迟吗?

更新:

在深入研究这个问题的过程中,我发现延迟只发生在特定的查询上,例如 DELETEUPDATEINSERTSELECT 等查询执行得很好。

DELETEUPDATE 查询的特点是什么都不返回。

所以实际的问题是查询客户端(假设psql)正在等待数据库服务器的响应,但是对于这些查询服务器什么都不返回。所以客户端继续等待,超时后抛出异常。

但我找不到更改的地方来解决这个问题。

最佳答案

问题出在 postgresql.conf 中的 synchronous_standby_names 参数。

在我的 postgresql.conf 中,它是 synchronous_standby_names = '*'

当我注释掉该行时,我能够执行所有查询。

来自PostgreSQL documentation :

synchronous_standby_names (string) : At any one time there will be at most one active synchronous standby; transactions waiting for commit will be allowed to proceed after this standby server confirms receipt of their data.

. . .

If no synchronous standby names are specified here, then synchronous replication is not enabled and transaction commits will not wait for replication.

所以实际的问题是:
查询客户端(假设是 psql)正在等待数据库服务器响应,但是对于这些查询,服务器没有返回任何内容,因为启用了同步复制。所以客户端继续等待,超时后抛出异常。

关于java - PostgreSQL 异常 : org. postgresql.util.PSQLException:发送到后端时发生 I/O 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20878854/

相关文章:

java - 上传并读取文件

java - 无法打开嵌套条目“WEB-INF/lib/example.jar”

MySQL:两列之间的条件

mysql - 如何进行表连接,其中组合键是访问号码和日期 +/- 1 天

sql - Postgresql 在使用空值优先/限制对空列进行排序时出现奇怪的行为

database - postgres 9.6 - jsonb 和索引 - 性能不佳

sql - 聚合查询避免外部磁盘排序

java - 在 Ubuntu OpenJDK 7 上启用密码

mysql - 如何提取MySQL中某个字符之后出现的字符串?

java - NoiseInk 中的透明背景 (Java)