繁体   English   中英

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

[英]How is Oracle's JDBC query timeout implemented?

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

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

达到超时后,客户端和数据库上的哪些资源被释放,哪些存在? 即使客户端放弃了查询还是终止,Oracle是否继续运行查询? 客户端是否还有游标对象?

谢谢

根据Oracle JDBC FAQ

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM