org.postgresql.util.PSQLException: 连接尝试失败

44

我正在使用Java Web服务(Apache Axis)连接到Postgres数据库,并使用JDBC连接获取数据。但是在大多数情况下,我会突然收到一个org.postgresql.util.PSQLException:连接尝试失败的异常,有时它能正常工作。在这里,我使用了许多预处理语句。我的示例代码如下:

Connection connection=null;
try
{
    Class.forName(driver);
    connection = DriverManager.getConnection(url, username, password);
    ps1=connection.prepareStatement("select * from emp");
    rs1=ps1.executeQuery();
    while(rs1.next())
    {            
        ps2=connection.prepareStatement("select * from dept where dept_no="+rs1.getInt("dept_no"));
        rs2=ps2.executeQuery();
        while(rs2.next())
        {
            ................
            ................
        }
    }
}
catch(Exception e)
{
    System.out.println("Exception occurred is"+e.getMessage());            
}
finally
{
    try{if(rs1!=null)rs1.close();}catch(Exception e){ System.out.println("*1closing error--->"+e);}
    try{if(ps1!=null)ps1.close();}catch(Exception e){ System.out.println("**1closing error--->"+e);}
    try{if(rs2!=null)rs2.close();}catch(Exception e){ System.out.println("*2closing error--->"+e);}
    try{if(ps2!=null)ps2.close();}catch(Exception e){ System.out.println("**2closing error--->"+e);}
    try{if(connection!=null)connection.close();}catch(Exception e){ System.out.println("***closing error--->"+e);}
}

这个异常的堆栈跟踪如下:

org.postgresql.util.PSQLException: The connection attempt failed.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:137)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:124)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
    at org.postgresql.jdbc3.Jdbc3Connection.<init>(Jdbc3Connection.java:24)
    at org.postgresql.Driver.makeConnection(Driver.java:386)
    at org.postgresql.Driver.connect(Driver.java:260)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.codon.service.WareHouseServer.get_picks(WareHouseServer.java:7415)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
    at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
    at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:454)
    at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
    at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
    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:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    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.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:254)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:95)
    ... 37 more

我检查了postgres日志,并在不同情况下发现了以下语句:

1.WARNING: worker took too long to start; cancelled.

2.无法重新连接到共享内存 (key=...., addr=.....):487。

3.无法从客户端接收数据:由于目标计算机积极拒绝,无法建立连接。

4.意外的EOF在客户端连接上。

请帮忙。谢谢!


2
你需要展示完整的异常堆栈跟踪信息,因为嵌套的异常将包含问题的细节。考虑到你没有使用池化连接,如果出现max_connections问题,我不会感到惊讶,但是如果没有完整的错误信息,很难说。 - Craig Ringer
你是否关闭了所有的预处理语句和结果集?在某个示例中,ps2和rs2的关闭是隐藏的。 - Alex Turbin
我更新了关于异常的堆栈跟踪,并且上次我忘记发布ps2rs2的关闭语句。我已经在应用程序中完成了这个操作。 - Sasi Vara Prasad
PostgreSQL服务器版本和主机操作系统是什么?它可能是Windows服务器吗? - Craig Ringer
嗨,@Sasi Vara Prasad,我遇到了与同样的PostgreSQL日志相同的问题。我正在使用默认的Hibernate连接池。你能解决这个问题吗? - wattale
3个回答

22
真正的问题是:
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read

Java 尝试从连接中读取数据时发现该连接已关闭。这可能是由以下原因造成的:
  • PostgreSQL 服务器正在重新启动
  • 您所连接的 PostgreSQL 后端已被终止
  • 您所连接的 PostgreSQL 后端崩溃了
  • 网络连接不稳定
  • 行为异常的有状态防火墙
  • 空闲连接在 NAT 防火墙/路由器的 NAT 连接表中超时

... 还有可能有其他原因。请检查 PostgreSQL 服务器日志是否有任何相关信息,并考虑使用像 Wireshark 这样的工具进行一些网络跟踪。


我在我的问题中更新了postgres日志文件中的语句。 - Sasi Vara Prasad

3

尝试检查PostgreSQL版本,在我的情况下,我使用以下方式部署我的应用程序:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>

但是在本地我使用了42.2.18版本,并且正常工作,所以我不知道具体的版本号。因此你可以尝试其他版本。


2

我的问题已解决:

进入pg_hba.conf文件,将IPV4连接下的127.xxxx更改为0.0.0.0/0

再次检查:进入postgresql.conf,将listenaddresses更改为*(我相信你知道需要先删除起始的#才能使其生效)

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接