2013-06-24 36 views
11

Tôi đang thử nghiệm một số mã xử lý đăng ký cho trang web. Mã java là như sau (trích):Ngoại lệ PostgreSQL: "Đã xảy ra lỗi I/O khi gửi tới phụ trợ"

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

Phần lớn thời gian quá trình thực hiện mà không cần bất kỳ vấn đề, nhưng tôi nhận được một vấn đề không liên tục mà nó không thành công bởi vì kết nối đến cơ sở dữ liệu được đóng cửa. Mỗi khi nó thất bại, nó không thành công tại cùng một điểm - khi chạy câu lệnh đã chuẩn bị ở trên (kiểm tra xem email được gửi đã có trong cơ sở dữ liệu rõ ràng chưa).

Phiên bản Postgres là 8.1.23

Bất kỳ trợ giúp hoặc đề xuất nào được đánh giá cao. Stacktrace là như sau (EDIT: Đôi khi các stacktrace nói do Suối Đóng, và đôi khi ổ cắm đóng cửa như sau):

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

Bạn đang tạo một kết nối cơ sở dữ liệu duy nhất và giữ nó mở trong một thời gian dài? – DaveH

+0

Ổ cắm đang được máy chủ đóng, có thể là do thời gian chờ không hoạt động. –

Trả lời

3

Tôi nghi ngờ rằng ứng dụng của bạn và cơ sở dữ liệu là trên các máy khác nhau và có một (stateful) tường lửa một nơi nào đó ở giữa. Tôi đoán là tường lửa đang bỏ kết nối sau khi nó đã được mở trong một khoảng thời gian nhất định có lẽ không có lưu lượng trên đó. Các hồ bơi kết nối sẽ không thể phát hiện điều này trước khi giao cho bạn một kết nối bị hỏng. Điều duy nhất khiến tôi nghi ngờ điều này là nó luôn luôn xảy ra ở cùng một vị trí trong mã nhưng nếu đó là truy vấn cơ sở dữ liệu đầu tiên trong một phiên mới (hoặc một cái gì đó như thế) thì không phải là điều không thể tưởng tượng được. cùng một nơi.

+0

Cảm ơn câu trả lời của bạn. @Dave - Tôi đã thử cả hai cách, mở một kết nối mới trước truy vấn và cũng để nó mở từ truy vấn trước đó. Vấn đề tái tạo chính nó một trong hai cách. – James

+0

Nhưng là kết nối "mới" đến từ một hồ bơi kết nối hoặc là nó thực sự thực sự mới? Nếu đó là từ một hồ bơi có thể là kết nối đã bị hỏng khi bạn nhận được nó. – wobblycogs

+0

Tôi hiện không sử dụng hồ bơi kết nối tại Wobbly. – James

8

Mặc dù nó thực sự là muộn để trả lời, tôi hy vọng có lẽ điều này sẽ giúp ai đó.

Tôi có cùng ngoại lệ, nhưng tôi kết nối với một db cục bộ trên cùng một máy chủ.
Lý do là kết nối, không hợp lệ nữa và vì vậy tôi cần mở lại.

Có một số ticket trên postgresql.org có chủ đề liên quan. Câu trả lời của họ là khá tương tự, bằng cách chỉ bắt ngoại lệ và mở lại các kết nối

PostgreSQL Version: 8.4

+0

Tôi vừa gặp lỗi tương tự, chạy trên 8.3.x – momomo

+0

Tương tự trên 9.3.2 trên máy chủ cục bộ (từ một thùng java được gọi qua dòng lệnh) –

+0

Tôi cũng gặp phải vấn đề tương tự. Nhưng tôi tự hỏi làm thế nào kết nối nhận được không hợp lệ? – apm

0

tôi đã cùng một vấn đề trong một thử nghiệm, nhưng lý do là trong các cuộc gọi của một nextSequenceId giữa tạo một lệnh PreparedStatement và executeUpdate, sử dụng cùng một đối tượng Connection. Giải pháp của tôi đã di chuyển cuộc gọi của nextSequenceId ở đầu phương thức và vấn đề biến mất.

Các vấn đề liên quan