Java 1.6和Oracle JDBC 14 setQueryTimeout不起作用

时间:2012-11-30 12:39:23

标签: java sql database oracle jdbc

我们运行Java 1.6并使用最新的ojdbc14.jar。我们连接到远程Oracle数据库。 我们想要设置QueryTimeout,因为查询的完成时间不得超过2分钟。

我做到了:

  statement = conn.prepareCall(call);
  statement.setQueryTimeout(120);
  statement.executeQuery();

经过8分钟后,它最终会超时!有什么想法或解决方法吗? 一如既往,非常感谢您的帮助!

编辑:我们使用瘦驱动程序

2 个答案:

答案 0 :(得分:2)

在此处查看Oracle JDBC驱动程序中的查询超时如何工作:https://forums.oracle.com/forums/thread.jspa?threadID=550257

长话短说:

  1. 当超时到期时,需要对数据库进行完整的往返以取消SQL执行。数据库将在感觉就好时处理取消请求。
  2. 驱动程序超时机制不是高精度机制。由于实际取消执行需要通过网络与数据库通信,因此没有必要使驱动程序超精确。即使驱动程序是精确的,网络延迟和数据库响应取消请求所需的时间也会否定驱动程序的精度。因此,超时是驱动程序在向服务器发送取消之前执行SQL的最短时间。

答案 1 :(得分:1)

尝试在客户端JVM系统属性中传递-Doracle.net.disableOob = true。根据{{​​3}},

  

Thin默认从11g开始使用带外中断。如果用户更喜欢使用Inband中断而不是带外中断,则可以将此属性设置为true。

在某些情况下,基础协议不支持带外中断,或者数据库未配置为侦听带外中断。