PostgreSQL Ausnahme: "Ein I/O-Fehler aufgetreten beim senden an das backend"
Teste ich einige code, der die Prozesse der Registrierung auf einer website. Der java-code lautet wie folgt (Auszug):
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.....
Meisten der Zeit, die der Prozess ausgeführt, ohne jedes problem, aber ich bin immer ein zeitweilig auftretendes Problem, bei dem es schlägt fehl, da die Verbindung zur Datenbank wird geschlossen. Jedes mal, wenn es scheitert, scheitert es an der gleichen Stelle - beim ausführen der vorbereiteten Anweisung oben (die prüft, ob die E-Mail abgesendet wurde, ist bereits in der Datenbank offensichtlich).
Version von Postgres ist 8.1.23
Jede Hilfe oder Anregungen geschätzt. Stacktrace sieht wie folgt aus (EDIT: Manchmal ist der Stacktrace sagt, verursacht durch Stream Geschlossen, und manchmal Socket Geschlossen wie unten):
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
Der socket wird geschlossen und der server, der wahrscheinlich durch einen idle-timeout.
InformationsquelleAutor James | 2013-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist zwar wirklich spät, Sie zu beantworten, hoffe ich vielleicht jemandem helfen.
Bekam ich die gleiche Ausnahme, aber ich habe eine Verbindung zu einer lokalen db auf dem gleichen host.
Der Grund dafür war die Verbindung, die war nicht mehr gültig und so musste ich es wieder öffnen.
Es ist ein ticket auf postgresql.org die hat einem verwandten Thema. Ihre Antwort ist ziemlich ähnlich, nur durch das abfangen der Ausnahme und re-öffnen Sie die Verbindung
PostgreSQL-Version: 8.4
Gleich auf 9.3.2 auf localhost (aus einer java-jar aufgerufen, über die Kommandozeile)
Ich habe auch immer das gleiche problem. Aber ich bin wondoring, wie die Verbindung immer ungültig?
Ich denke, weil der socket-Timeouts, wenn die Verbindung nicht genutzt wird für einen bestimmten Zeitraum.
InformationsquelleAutor David Artmann
Ich vermute, dass Ihre Anwendung und die Datenbank auf verschiedenen Maschinen, und es gibt eine (stateful) firewall irgendwo dazwischen. Meine Vermutung ist, dass die firewall fallen die Verbindung, nachdem es geöffnet hat, für eine gewisse Zeit vielleicht kein Verkehr. Die Verbindung pool wäre nicht in der Lage, dies zu erkennen, bevor Sie übergeben Sie die Verbindung abbricht.
Das einzige, was mich daran zweifeln, dass es passiert immer an der gleichen Stelle im code, aber wenn, dass ist das erste Datenbank-Abfrage in eine neue Sitzung (oder so ähnlich) es ist nicht undenkbar, könnte es erscheinen immer an der gleichen Stelle.
Aber ist die "neue" Verbindung aus einem Verbindungs-pool-oder ist es eigentlich wirklich neu? Wenn es aus einem pool ist es möglich, dass die Verbindung unterbrochen, wenn du es hast.
Ich bin nicht mit einem Verbindungs-pool derzeit Wackelig.
InformationsquelleAutor wobblycogs
Ich hatte das gleiche problem, in einem test, aber der Grund war in den Ruf eines nextSequenceId zwischen der Erstellung eines PreparedStatement und die executeUpdate-Methode nennen, mit der gleichen Connection-Objekt.
Meine Lösung war, bewegen Sie den Anruf von nextSequenceId an der Spitze der Methode und das problem verschwand.
InformationsquelleAutor Francisco Cifuentes