web-dev-qa-db-fra.com

Exception PostgreSQL: "Une erreur d'E/S s'est produite lors de l'envoi au serveur"

Je teste un code qui traite l'inscription sur un site Web. Le code Java est le suivant (extrait):

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

La plupart du temps, le processus s'exécute sans problème, mais je reçois un problème intermittent qui échoue car la connexion à la base de données est en train de se fermer. Chaque fois qu'il échoue, il échoue au même moment - lors de l'exécution de l'instruction préparée ci-dessus (qui vérifie si le courrier électronique soumis est déjà présent dans la base de données).

La version de Postgres est 8.1.23

Toute aide ou suggestion sera appréciée. Stacktrace se présente comme suit (EDIT: Parfois, Stacktrace indique qu’il est causé par Stream Closed, et parfois Socket Closed comme ci-dessous):

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      
12
James

Bien qu'il soit très tard pour répondre, j'espère que cela aidera peut-être quelqu'un.

J'ai la même exception, mais je me connecte à une base de données locale sur le même hôte. 
La raison en était la connexion, qui n’était plus valide et j’avais donc besoin de l’ouvrir à nouveau.

Il y a un ticket sur postgresql.org qui a un sujet connexe. Leur réponse est assez similaire, en attrapant simplement l'exception et en rouvrant la connexion

Version PostgreSQL: 8.4

9
David Artmann

Je soupçonne que votre application et la base de données sont sur des machines différentes et qu'il existe un pare-feu (avec état) quelque part entre les deux. Je suppose que le pare-feu supprime la connexion après avoir été ouvert pendant un certain temps, peut-être sans trafic. Le pool de connexions ne pourrait pas détecter cela avant de vous envoyer une connexion interrompue. 

La seule chose qui me fait penser que cela se passe toujours au même endroit dans le code, mais s'il s'agit de la première requête de base de données dans une nouvelle session (ou quelque chose du genre), il n'est pas inconcevable que cela puisse toujours apparaître au même endroit.

3
wobblycogs

J'ai eu le même problème dans un test, mais la raison en était dans l'appel d'un nextSequenceId entre la création d'un processus PreparedStatement et l'appel de la méthode executeUpdate, à l'aide du même objet Connection . haut de la méthode et le problème a disparu.

0
Francisco Cifuentes