【问题标题】:How is Oracle's JDBC query timeout implemented?Oracle的JDBC查询超时是如何实现的?
【发布时间】:2011-01-23 12:19:04
【问题描述】:

我很好奇 Oralce JDBC 瘦客户端如何实现查询超时。 这可以通过调用 java.sql.Statement 的 setQueryTimeout(int seconds) 来设置 方法。

这是否在客户端的驱动程序本身中实现?是一个 新线程产生并加入?或者只是简单的JDBC驱动 向Oracle发送一个参数,然后它会强制超时?

达到超时后,客户端上的哪些资源和 数据库都发布了,还有哪些闲逛?甲骨文是否继续 运行查询,即使客户端放弃了它或者是它 终止?客户端还有游标对象吗?

谢谢

【问题讨论】:

标签: java oracle jdbc timeout


【解决方案1】:

根据Oracle JDBC FAQ

语句超时线程。如果您执行任何带有超时的语句,则会创建此线程。 无论有多少语句或连接,都只创建一个线程。该线程持续 VM 的生命周期。

【讨论】:

    【解决方案2】:

    当使用 setTimeOut 方法时查询实际超时时,Oracle 服务器会抛出带有 Oracle 错误代码 ORA-01013 - user requested cancel of current operation 的 SQL 异常。

    这意味着操作已被取消优雅(就 oracle 而言/尽可能多的 oracle 可以) - 因为它是 oracle 发送此消息。

    【讨论】:

      【解决方案3】:

      Tanel Poder 写了一封article,介绍了取消是如何通过 OCI(Oracle 调用接口)工作的。 我猜想对 JDBC 也做了类似的事情。如果您使用的是厚驱动程序,通过 OCI,您可以尝试跟踪会话(通过设置 sqlnet.ora)并查看记录的内容。

      【讨论】:

      • 那么,这是否意味着 JDBC 驱动程序会为查询生成另一个线程并等待它超时,然后发送 OCICancel?
      • 不能说它是一个单独的线程还是只是一个循环说“来自服务器的任何东西......它是否超时......来自服务器的任何东西......它是否超时。 ...”
      【解决方案4】:

      我知道当达到超时时查询不会在服务器端继续。在达到超时之前或之后,有一些意图/信号选项发送到服务器,以指示服务器应该停止。我已经通过在各种 V$ 表中查看服务器以查看查询是否正在运行来验证这一点。 (V$SESSION、V$SQL 等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 2018-08-03
        • 2019-02-26
        • 2011-12-20
        • 2010-11-26
        • 2015-01-31
        • 2014-09-24
        相关资源
        最近更新 更多