2013-06-24 19 views
11

Testuję kod, który przetwarza rejestrację na stronie internetowej. Kod Java jest następująco (wyciąg):Wyjątek PostgreSQL: "Wystąpił błąd I/O podczas wysyłania do zaplecza"

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..... 

Większość czasu proces wykonuje bez żadnego problemu, ale jestem coraz przerywany problem, gdzie to nie działa, ponieważ połączenie z bazą danych jest zamknięcie. Za każdym razem, gdy się nie powiedzie, nie powiedzie się w tym samym momencie - po uruchomieniu przygotowanej powyższej instrukcji (która sprawdza, czy przesyłana wiadomość jest już w bazie danych oczywiście).

wersja PostgreSQL jest 8.1.23

Każda pomoc lub sugestie mile widziane. StackTrace jest następujący (edycja: Czasami StackTrace mówi spowodowanego Stream zamknięte, a czasami Socket Zamknięte jak poniżej):

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  
+0

Tworzysz pojedyncze połączenie z bazą danych i przytrzymujesz je przez dłuższy czas? – DaveH

+0

Gniazdo jest zamykane przez serwer, prawdopodobnie po upływie limitu czasu bezczynności. –

Odpowiedz

3

Podejrzewam, że aplikacja i baza są na różnych maszynach i tam (Stateful) firewall gdzieś pomiędzy. Domyślam się, że zapora sieciowa zrzuca połączenie po pewnym czasie, być może bez ruchu na nim. Pula połączeń nie będzie w stanie tego wykryć przed przekazaniem ci zerwanego połączenia.

Jedyną rzeczą, która sprawia, że ​​wątpię w to jest to, że zawsze dzieje się w tym samym miejscu w kodzie, ale jeśli jest to pierwsze zapytanie do bazy danych w nowej sesji (lub coś podobnego), nie jest nie do pomyślenia, może zawsze pojawić się w to samo miejsce.

+0

Dziękuję za odpowiedzi. @Dave - próbowałem obu sposobów, otwierając nowe połączenie przed zapytaniem, a także pozostawiając je otwarte z poprzedniego zapytania. Problem powtarza się w dowolny sposób. – James

+0

Ale czy "nowe" połączenie pochodzi z puli połączeń, czy jest naprawdę naprawdę nowe? Jeśli pochodzi z puli, możliwe jest, że połączenie zostało przerwane, gdy je otrzymałeś. – wobblycogs

+0

Nie korzystam obecnie z puli połączeń Wobbly. – James

8

Chociaż jest bardzo późno na odpowiedź, mam nadzieję, że może to pomoże komuś.

Mam ten sam wyjątek, ale łączę się z lokalną bazą danych na tym samym hoście.
Powodem było połączenie, które nie było już ważne i dlatego musiałem otworzyć je ponownie.

Istnieje ticket na postgresql.org, który ma pokrewny temat. Ich odpowiedź jest dość podobny, tylko o łapanie wyjątków i ponownie otworzyć połączenie

PostgreSQL Wersja: 8.4

+0

Po prostu miałem ten sam błąd, uruchomiony na 8.3.x – momomo

+0

To samo z 9.3.2 na localhost (ze słownika Javy wywoływanego przez linię komend) –

+0

Też mam ten sam problem. Ale zastanawiam się, w jaki sposób połączenie staje się nieważne? – apm

0

Miałem ten sam problem w teście, ale powód był w rozmowie z nextSequenceId między tworzenie wywołania metody PreparedStatement i executeUpdate przy użyciu tego samego obiektu Connection. Moim rozwiązaniem było przeniesienie wywołania nextSequenceId u góry metody, a problem zniknął.

Powiązane problemy