程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> 在Oracle 8x中實現自動斷開後再連接

在Oracle 8x中實現自動斷開後再連接

編輯:關於Oracle數據庫

  在實際的數據庫應用中,我們經常遇到這樣一個問題,連接到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數據庫系統斷開連接的語句,登陸時間以及最後一次操作到現在的空閒時間等等。

SELECT s.username 用戶名稱, s.status 狀態,s.machine 機器名稱,
    osuser 操作系統用戶名稱,spid UNIX進程號,
'kill -9 '||spid UNIX級斷開連接,
'alter system kill session ' ||''''||s.sid||','||s.serial# || ''';' Oracle級斷開連接,
TO_CHAR (Logon_time, 'dd/mm/yyyy hh24:mi:ss') 登陸時間,
last_call_et 空閒時間秒,
TO_CHAR (TRUNC (last_call_et / 3600, 0))||' '||' HRS '||
TO_CHAR (
TRUNC ((last_call_et - TRUNC (last_call_et / 3600, 0) * 3600) / 60, 0)
) ||' MINS' 空閒時間小時分鐘,
module 模塊
FROM v$session s, v$process p
WHERE TYPE = 'USER'
AND p.addr = s.paddr
AND status != 'KILLED'
-- AND SUBSTR (machine, 1, 19) NOT IN ('機器名')
AND last_call_et > 60 * 60 * 1 -- 空閒時間超過1小時的連接
ORDER BY last_call_et desc; 

  在上面的查詢中,我們可以通過SUBSTR (machine, 1, 19) NOT IN ('機器名')這個條件來屏蔽一些機器,這些機器可能需要運行一些耗費很長時間的SQL語句或其他一些特殊情況的機器。屏蔽這些機器的原因就是在後面的後台自動識別及處理任務中對這些機器不作處理。

  • 首頁
  • 上一頁
  • 1
  • 2
  • 下一頁
  • 尾頁
  • 共2頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved