PostgreSQL异常:"发送到后端时发生I/O错误"

Jam*_*mes 18 java postgresql io

我正在测试一些处理网站注册的代码.java代码如下(摘录):

if (request.getParameter("method").equals("checkEmail")){
            String email= request.getParameter("email");
            ResultSet rs =null;
            PreparedStatement ps = db.prepareStatement(query);
            ps.setString(1, email);
            rs = ps.executeQuery();             
            if(rs.next()){ 
                            //email already present in Db 
            } else {
                            //proceed with registration.....
Run Code Online (Sandbox Code Playgroud)

大多数情况下,该过程执行没有任何问题,但我遇到了一个间歇性问题,因为它与数据库的连接正在关闭.每次失败时,它都会在同一点失败 - 运行上面准备好的语句(检查提交的电子邮件是否已经显然在数据库中).

Postgres的版本是8.1.23

任何帮助或建议表示赞赏.Stacktrace如下(编辑:有时Stacktrace说由Stream Closed导致,有时Socket Closed如下):

13:53:00,973 ERROR Registration:334 - org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.

  at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:283)
  at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479
  at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367)
  at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271)
  at Registration.doPost(Registration.java:113)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
  at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
  at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
  at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
  at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
  at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
  at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
  at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
  at java.lang.Thread.run(Thread.java:595)

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:135)
  at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:104)
  at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73)
  at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:259)
  at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1620)
  at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    ... 22 more      
Run Code Online (Sandbox Code Playgroud)

Dav*_*ann 12

虽然回答真的很晚,但我希望这可能对某些人有所帮助.

我得到了相同的异常,但我连接到同一主机上的本地数据库.
原因是连接不再有效,所以我需要再次打开它.

postgresql.org上有一张相关主题的票.他们的答案非常相似,只需捕获异常并重新打开连接即可

PostgreSQL版本:8.4


Ash*_*lla 7

我得到了同样的异常。

就我而言,由于某些查询大量使用内存,我的数据库正在重新启动。这就是为什么我在数据库重新启动期间收到该错误的原因。

解决方案:我优化了我的查询。


wob*_*ogs 6

我怀疑您的应用程序和数据库位于不同的计算机上,并且两者之间存在(状态)防火墙。我的猜测是,防火墙在打开一定时间后可能会断开连接,可能没有流量。在向您发送断开的连接之前,连接池将无法检测到该错误。

唯一令我怀疑的是它总是在代码中的同一位置发生,但是如果这是新会话中的第一个数据库查询(或类似的东西),那不是不可能的,它可能总是出现在同一位置。