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

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

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

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

谢谢

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

根据Oracle JDBC FAQ

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

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

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

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