我很好奇Oralce JDBC瘦客户端如何实现查询超时。 这可以通过调用java.sql.Statement的setQueryTimeout(int seconds)来设置 方法
这是在客户端的驱动程序本身实现的吗?是一个 新线程产生并加入?或者简单地说JDBC驱动程序 发送一个参数给Oracle,然后它强制执行超时?
达到超时后,客户端上的资源和 数据库发布了,哪个挂了? Oracle会继续吗? 即使客户端放弃了它,也可以运行查询 终止?客户端是否还有游标对象?
谢谢
答案 0 :(得分:15)
语句超时线程。如果执行任何超时语句,则会创建此线程。 无论有多少语句或连接,都只创建一个线程。此线程会持续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等)