2013-06-24 101 views
11

ウェブサイトへの登録を処理するコードをテストしています。 (抜粋)は以下のようなJavaコードは次のとおりです。プロセスは問題なく実行時間のほとんどPostgreSQLの例外:「バックエンドに送信中にI/Oエラーが発生しました」

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

が、私は、データベースへの接続がクローズされているので、それが失敗した断続的な問題を取得しています。それが失敗するたびに、上記の準備文を実行する(同じ電子メールがすでにデータベースに入っているかどうかを確認する)同じ時点で失敗します。

のPostgresのバージョンは8.1.23感謝

すべてのヘルプや提案です。次のようにスタックトレースが(:時々スタックトレースは、ストリームクローズによって引き起こされると言い、時にはソケットは、以下のように休館EDIT):ある

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

1つのデータベース接続を作成していて、長時間開いていますか? – DaveH

+0

ソケットがサーバーによって閉じられている可能性があります。アイドルタイムアウトが原因である可能性があります。 –

答えて

3

私はあなたのアプリケーションとデータベースが異なるマシン上にあると(ステートフル)ファイアウォールがあることを疑いますその間のどこかに。私の推測では、ファイアウォールは、トラフィックがなくても一定時間オープンした後に接続が切断されているということです。接続プールは、切断された接続を渡す前にこれを検出することができません。

私がこれを疑う唯一の事は、常にコード内の同じ場所で起こっていることですが、新しいセッション(またはそのようなもの)の最初のデータベースクエリであれば、いつもそこに現れる可能性があります同じ場所。

+0

あなたの答えをありがとう。 @Dave - 両方の方法を試してみました。クエリの前に新しい接続を開き、以前のクエリから開いたままにしました。この問題はいずれかの方法で再現されます。 – James

+0

"新しい"接続は接続プールから来ているのですか、それとも実際には本当に新しいのですか?それがプールからのものであれば、接続が切れた可能性があります。 – wobblycogs

+0

現在、接続プールを使用していません。Wobbly。 – James

8

本当に答えが遅いですが、これが誰かを助けるかもしれないことを願っています。

同じ例外が発生しましたが、同じホストのローカルデータベースに接続します。
理由は接続でした。これはもう有効ではなかったので、もう一度開く必要がありました。

postgresql.orgには、関連トピックがあります。ticketがあります。彼らの答えは、単に例外をキャッチすることによって、かなり似ており、再オープン接続

PostgreSQLのバージョン:8.4

+0

私はちょうど8.3.xで実行している同じエラーが発生しました – momomo

+0

localhostの9.3.2と同じです(viaコマンドライン経由のJava jarから) –

+0

同じ問題が発生しました。しかし、私はどのように接続が無効になっているのだろうか? – apm

0

私はテストで同じ問題を抱えていたが、その理由は間nextSequenceIdの呼び出しでいました同じConnectionオブジェクトを使用してPreparedStatementとexecuteUpdateメソッド呼び出しを作成します。 私の解決策は、メソッドの先頭でnextSequenceIdの呼び出しを移動し、問題が消えたことです。

関連する問題