兩層 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;
KILL_IDLE_SESSIONS(p_idle_sec IN NUMBER)。DBMS_JOB 或 DBMS_SCHEDULER 每 10~15 分鐘執行一次。ALTER SYSTEM KILL SESSION,記錄審計表。應用伺服器端配置連線池 (Min/Max Pool Size、Idle Timeout、Validate Connection),由中間層統一管理連線生命週期,資料庫層無需額外 Kill。