首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 8i 實現閒置連線自動斷開與重連:V$SESSION 監控腳本

     編輯:Oracle 資料庫相關知識

問題背景

兩層 C/S 架構下,用戶操作完畢長時間不斷線,佔用 Server Process、PGA、鎖資源,嚴重時導致新連線無法建立、效能驟降。

解決方案:後台監控作業

定期查詢 V$SESSION 識別閒置超時連線,於客戶端提示或直接 Kill。

關鍵欄位

  • LOGON_TIME (DATE):登入時間。
  • LAST_CALL_ET (NUMBER, 秒):上一條 SQL 結束後經過秒數,每次新 SQL 歸零。

完整識別腳本

SELECT s.username,
       s.status,
       s.machine,
       s.osuser,
       p.spid,
       'kill -9 ' || p.spid AS unix_kill_cmd,
       'ALTER SYSTEM KILL SESSION ''' || s.sid || ',' || s.serial# || ''';' AS oracle_kill_cmd,
       TO_CHAR(s.logon_time, 'DD/MM/YYYY HH24:MI:SS') AS logon_time,
       s.last_call_et AS idle_sec,
       TRUNC(s.last_call_et/3600) || ' HRS ' ||
       TRUNC(MOD(s.last_call_et,3600)/60) || ' MINS' AS idle_hms,
       s.module
FROM v$session s, v$process p
WHERE s.type = 'USER'
  AND p.addr = s.paddr
  AND s.status != 'KILLED'
  -- AND SUBSTR(s.machine,1,19) NOT IN ('excluded_host')  -- 排除長跑作業主機
  AND s.last_call_et > 3600  -- 閒置超過 1 小時
ORDER BY s.last_call_et DESC;

自動化部署建議

  1. 將上述查詢封裝為 PL/SQL 程序 KILL_IDLE_SESSIONS(p_idle_sec IN NUMBER)。
  2. 建立 DBMS_JOB 或 DBMS_SCHEDULER 每 10~15 分鐘執行一次。
  3. 程式邏輯:游標迴圈執行動態 ALTER SYSTEM KILL SESSION,記錄審計表。
  4. 排除清單:報表伺服器、批次作業主機、連線池中間層 (需保持長連線)。

三層 B/S 架構替代方案

應用伺服器端配置連線池 (Min/Max Pool Size、Idle Timeout、Validate Connection),由中間層統一管理連線生命週期,資料庫層無需額外 Kill。

效果

  • 釋放 Server Process、PGA、Undo Segment、鎖資源。
  • 避免「連線風暴」導致新用戶無法登入。
  • 審計追蹤符合合規要求。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved