Oracle的JDBC查询超时是如何实现的?

时间:2010-03-04 03:04:38

标签: java oracle jdbc timeout

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

这是在客户端的驱动程序本身实现的吗?是一个 新线程产生并加入?或者简单地说JDBC驱动程序 发送一个参数给Oracle,然后它强制执行超时?

达到超时后,客户端上的资源和 数据库发布了,哪个挂了? Oracle会继续吗? 即使客户端放弃了它,也可以运行查询 终止?客户端是否还有游标对象?

谢谢

4 个答案:

答案 0 :(得分:15)

根据Oracle JDBC FAQ

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

答案 1 :(得分:12)

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

答案 2 :(得分:2)

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

这意味着操作已被取消正常(就oracle而言/ oracle可以这么多) - 因为它是oracle发送此消息。

答案 3 :(得分:1)

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