簡體   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