【问题标题】:Java 1.6 and Oracle JDBC 14 setQueryTimeout not workingJava 1.6 和 Oracle JDBC 14 setQueryTimeout 不起作用
【发布时间】:2012-11-18 16:31:14
【问题描述】:

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

我已经这样做了:

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

大约 8 分钟后,它最终超时!对此有任何想法或解决方法吗? 一如既往,我们非常感谢您的帮助!

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

【问题讨论】:

  • 如果您使用的是 Java SE 6,为什么不使用 ojdbc6.jar?
  • AFAIK 对setQueryTimeout 的支持在大多数驱动程序中受到限制或不存在。确保 Oracle 驱动程序确实支持它。
  • 好的,我下载 ojdbc6.jar 试试看,谢谢...
  • 不走运,仍然没有超时。我将不得不找到一个支持 setQueryTimeout 的罐子:|
  • 你的驱动版本是石器时代!使用 11.2.0.3.0。这适用于超时。

标签: java sql database oracle jdbc


【解决方案1】:

尝试在客户端 JVM 系统属性中传递 -Doracle.net.disableOob=true。根据property documentation

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

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

【讨论】:

    【解决方案2】:

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

    长话短说:

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

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多