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等)
- 如何在Java Servlet中有效地破坏’session’?
- Spring 3.2 + Hibernate 4 OpenSessionInViewFilter
- 为什么我的原始类型争论方法不会覆盖包装类型争论的超类方法?
- RandomAccess接口,为什么没有方法?
- 在Java中挂钩现有方法
- 从套接字读取时如何检测客户端何时完成发送请求?
- System.getProperty(“java.class.path”)不显示“WEB-INF / lib”和包含jar
- 无法在自定义Apache Shiro AuthorizingRealm中@Inject我的DAO
- 即使超类实现相同的接口,在子类中实现接口也有任何好处