2012-03-09 45 views
4

我在我的應用程序下面的問題,它可以連接到Oracle 10g數據庫:Oracle:如何檢測客戶端進程終止是否適用於sqlplus?

當我的客戶端崩潰,或過程是通過任務管理器終止,或者客戶端在失去了一段時間的連接,適當的項v $會話視圖仍然存在。

現在,當我用sqlplus連接到數據庫時,我通過任務管理器殺死了sqlplus.exe,會話條目幾乎被立即刪除。

由於各種原因,後者的行爲將是我的申請的首選。

sqlplus做了什麼不同,我可以在我自己的應用程序中做到這一點嗎?

+0

當使用「瘦」oracle客戶端驅動程序而不是「OCI」驅動程序時,我遇到過這種差異。 – 2012-03-09 17:56:52

回答

1

進一步的調查顯示,雖然sqlplus在殺死進程時行爲不同,但事實上,當網絡電纜一秒鐘拔出時,其行爲方式相同=>懸掛會話將保留在服務器上。

我現在創建了一個用戶配置文件,其中有限的idle_time被分配給我需要的用戶。後臺線程發送「keepalive」查詢以保持PMON的連接不被SNIPED

看到我的其他問題Oracle: idle_time appears to be ignored如果你對我所做的事感興趣,並看到你要做的工作的答案,使idle_time工作。

2

SQL * Plus使用OCI - Oracle調用接口。這是一個廣泛的API(超過四百個函數調用,OCI提供了很多處理連接和會話的方法,我不確定但我猜SQL * Plus使用OCILogon2()爲用戶註冊專用會話,並提出一些在會話句柄這使得它能夠檢測時會話異常終止。

所以,可能是你的應用程序未使用OCI連接數據庫。如果你想知道更多關於OCI你可以閱讀文檔。被警告這是相當低層次的東西Find out more.

+0

我正在使用Qt,它提供QCIOCIOCI插件,這是一個圍繞OCI的Qt包裝。我想我會看看QSQLOCI層。 – 2012-03-09 14:05:50

+0

該層使用'OCIServerAttach'和'OCISessionBegin';我找不到任何「OCILogon」或「OCILogon2」。你知道ServerAttach/SessionBegin是否是OCILogon的替代品嗎?還是這些不相關? – 2012-03-09 14:31:40

1

您可以設置sqlnet.expire_time=minutes_to_check$ORACLE_HOME/network/admin/sqlnet.ora;!它不會是瞬間像OCI,但它會清理死連接

+0

這是否只清除死連接?或者它是否也會影響閒置超過'minutes_to_check'的連接? – 2012-03-12 08:01:02

+0

它確實實際上。我們以這種方式設置了我們的系統,因爲它關係到客戶端應用程序的容量並不重要,我們的大多數Java應用程序都使用連接池,因此他們可以重新啓動池中的死連接。 – 2012-03-12 15:19:17

+0

有沒有辦法爲當前會話設置類似的東西?問題是目標服務器用於多個應用程序(不僅是我們的),並且我們必須確保其他應用程序不會停止工作,當我們想要更改服務器上的任何東西時 – 2012-03-13 13:59:42

相關問題