执行executeUpdate()后超时

时间:2012-11-12 22:30:43

标签: java jdbc timeout connection-timeout

我在Java程序中有以下场景:

...
try

   // 1
   PreparedStatement pstmt1 = conn.getPreparedStatement("SQL QUERY");
   pstmt1.setQueryTimeout(1);
   pstm.executeUpdate();
   System.out.println("1 executed");

   // 2
   PreparedStatement pstmt2 = conn.getPreparedStatement("SQL QUERY");
   pstmt2.setQueryTimeout(1);
   pstmt2.executeUpdate();
   System.out.println("2 executed");

   // 3
   PreparedStatement pstmt3 = conn.getPreparedStatement("SQL QUERY");
   pstmt3.setQueryTimeout(1);
   pstmt3.executeUpdate();
   System.out.println("3 executed");

catch(Exception e){

     e.printStackTrace();

}
...

如果我"拔下电缆"在第一次执行executeUpdate()之后,与数据库的连接就丢失了。我如何告诉程序只等待1秒钟,如果没有响应立即进入捕获?

现在发生的事情是程序在该点之后被卡住(第一个执行更新(),在输出处" 1执行")。

方法pstmt.setQueryTimeout(1)似乎无效。

我已在服务器的连接池属性上设置10秒内的连接超时。

经过很长时间(半小时)后,我收到以下错误(预期错误):

The Connection Manager received a fatal connection error from the Resource Adapter for resource jdbc/JNDI_BD1.  The exception which was received is com.ibm.websphere.ce.cm.StaleConnectionException: [jcc][t4][2030][11211][3.58.82] A communication error occurred during operations on the connection's underlying socket, socket input stream, or socket output stream.  Error location: Reply.fill().  Message: No route to host. ERRORCODE=-4499, SQLSTATE=08001:com.ibm.db2.jcc.am.io: [jcc][t4][2030][11211][3.58.82] A communication error occurred during operations on the connection's underlying socket, socket input stream, or socket output stream.  Error location: Reply.fill().  Message: No route to host. ERRORCODE=-4499, SQLSTATE=08001:java.net.SocketException: No route to host

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

并非所有驱动程序都支持查询超时。但即使他们这样做:查询超时也不是为了检测网络超时。最有可能的选项如查询超时将由数据库服务器处理(即:驱动程序询问服务器:如果查询花费的时间超过xxx则中止查询),或者驱动程序和/或服务器根本不支持它。

套接字超时是一个低得多的超时,大多数驱动程序都会有一个连接属性设置(so_timeout,套接字超时等)。

答案 1 :(得分:0)

如果您可以将代码包装到Callable,我建议您使用guava's TimeLimiter::callWithTimeout。它专为此目的而设计。