正在看的ORACLE教程是:在Oracle 8x實現自動斷開後再串連。
在實際的資料庫應用中,我們經常遇到這樣一個問題,串連到Oracle資料庫的使用者在作了一次操作後,再也沒有後續操作,但卻長時間沒有和資料庫中斷連線。對於一個小型的應用系統來講,本身的串連數目就有限,這好像沒有什麼嚴重的後果,但如果對於一個大型的資料庫應用。如稅務、工商等,如果資料庫的串連數目很多,對於資料庫伺服器來講,多一個串連就要多消耗一份資源,如果大量使用者串連進入資料庫系統但卻不進行任何的操作,這無形之中就白白造成了伺服器系統資源的浪費,同時造成伺服器負載的提高,對於那些確實在工作的使用者來講,就不能最大限度的利用伺服器的資源,嚴重情況下可能造成系統效能的急劇下降。
針對這種問題,該如何處理呢?對於目前流行的三層結構(Browser/Application/Server)開發來講,這個問題可以通過設定應用伺服器端的串連共用池(shared pool)來避免。但對於傳統的兩層結構(Client/Server)應用,就必須由我們人為幹預來避免這種資源浪費情況。具體可以通過一個背景工作來監控系統中的所有進程,對於那些空閑超過一定時間的進程採取一定的特殊處理措施,如在用戶端提示使用者連線時間太長,如果沒有後續作業系統將自動殺掉該串連或者直接將該空閑串連殺掉。下面就來具體討論如何在Oracle 8x環境下實現使用者進程的自動監控及其對對超過一定空閑時間串連的處理辦法。
一、識別系統中超過一定空閑時間的串連
要實現背景工作自動對超過一定時間空閑串連的處理,首先第一步工作就是要從所有與資料庫伺服器的串連中識別出那些串連需要處理,也就是需要獲得與伺服器串連的每個使用者的登陸時間及其最後一次操作後的空閑時間。在Oracle系統中,有一個動態效能檢視v$session,該視圖儲存著系統當前串連的各種動態資訊。其中,有兩個欄位LOGON_TIME和 LAST_CALL_ET可以得到上面的兩個答案。
l LOGON_TIME是一個日期型(Date)欄位,為使用者登陸時間;
l LAST_CALL_ET是一個數字型(Number)欄位,其含義是使用者最後一條語句執行完畢後的時間,單位為秒。每次使用者執行一個新的語句後,該欄位複位為0,重新開始記數。我們可以通過該欄位來獲得一個串連使用者最後一次操作資料庫後的空閑時間。
下面的SQL查詢語句可以得到與當前資料庫連接的所有使用者的一些基本情況,如使用者名稱、狀態、串連機器的名稱,作業系統中使用者的名稱,UNIX系統的進程號,在UNIX作業系統級中斷連線的語句,Oracle資料庫系統中斷連線的語句,登陸時間以及最後一次操作到現在的空閑時間等等。
在上面的查詢中,我們可以通過SUBSTR (machine, 1, 19) NOT IN ('機器名')這個條件來屏蔽一些機器,這些機器可能需要運行一些耗費很長時間的SQL語句或其他一些特殊情況的機器。屏蔽這些機器的原因就是在後面的後台自動識別及處理任務中對這些機器不作處理。
[NextPage]
二、識別及斷開空閑使用者的預存程序
上面的查詢語句可以得到系統中所有的串連使用者的一些基本情況,但是又如何來實現系統自動判斷空閑超過一定時間的串連並將其自動斷開呢?Oracle系統提供了一種稱之為背景工作(Job)自動處理的機制。我們可以編寫一個背景工作來定時執行,從而判斷是否存在這樣的使用者串連,如果存在,則通過背景工作將其自動斷開。
首先建立一個預存程序來完成空閑一定時間使用者的識別和斷開工作,然後添加一個背景工作來定時(根據空閑時間長短來確定)執行該過程,即可實現自動斷開系統中空閑超過一定時間使用者的需求。
預存程序p_monitor見下,其中參數an_nimutes為使用者輸入參數,用來確定識別和斷開多長空閑時間串連的使用者,單位為分鐘,預設為60分鐘,也就是1小時。需要注意一點的是,該預存程序,需要以sys使用者身份運行。相應,調用該預存程序的背景工作也需要以SYS身份來添加。
三、背景工作的定時執行
最後,我們為系統添加一個定時任務,定時調用上面建立的預存程序,即可完成系統自動識別和處理空閑使用者的工作。
下面是一個實際調用的例子,在sys使用者下,首先添加一個任務,該任務每隔半小時運行一次,每次均調用P_monitor預存程序,找出系統中空閑時間超過1小時的串連,然後自動斷開。
上一頁