應用程式未正確關閉資料庫連線,導致連線池耗盡、系統癱瘓是常見事故。本文提供一條實戰 SQL,快速鎖定特定應用伺服器(如 WebLogic)正在執行的 SQL 文字,協助開發人員定位洩漏程式碼。
WLS254)連線數持續攀升,最終觸發 ORA-12519 或 ORA-00018。close() 或 returnConnection()。SELECT sql_text
FROM v$sqlarea a
WHERE a.HASH_VALUE IN (
SELECT b.prev_hash_value
FROM v$session b
WHERE b.MACHINE = 'WLS254' -- 替換為你的應用伺服器主機名
);
v$session 記錄每個當前連線的狀態,MACHINE 欄位可辨識發起連線的客戶端主機。prev_hash_value 指向該 session 最近執行的 SQL 在 v$sqlarea 的雜湊值。HASH_VALUE 關聯 v$sqlarea 即可取得完整 sql_text。| 欄位 | 說明 |
|---|---|
| SID / SERIAL# | Session 唯一識別碼,ALTER SYSTEM KILL SESSION 'sid,serial#' 時使用 |
| MACHINE | 客戶端主機名稱,定位應用伺服器關鍵 |
| PROGRAM | 客戶端程式名稱(如 java.exe、w3wp.exe) |
| OSUSER | 作業系統登入帳號 |
| STATUS | ACTIVE 執行中、INACTIVE 閒置、KILLED 已標記終止 |
| SQL_HASH_VALUE / SQL_ADDRESS | 當前/最近執行 SQL 的雜湊值與記憶體位址 |
| MODULE / ACTION | 經 DBMS_APPLICATION_INFO.SET_MODULE/ACTION 設定,便於追蹤業務流程 |
| LOGON_TIME | 連線建立時間,判斷長連線 |
| LAST_CALL_ET | 最後一次呼叫經過秒數,判斷閒置過久 |
SELECT s.sid, s.serial#, s.machine, s.program, s.osuser,
s.logon_time, s.last_call_et,
sq.sql_text
FROM v$session s
LEFT JOIN v$sqlarea sq ON s.sql_hash_value = sq.hash_value
WHERE s.machine = 'WLS254'
AND s.status = 'INACTIVE'
AND s.last_call_et > 3600 -- 閒置超過 1 小時
ORDER BY s.last_call_et DESC;
finally 區塊或 try-with-resources 中關閉。idleTimeout、maxLifetime,強制回收閒置連線。v$session 監控腳本,定期巡檢連線數與執行 SQL。DBMS_APPLICATION_INFO.SET_MODULE('模組名','動作名'),方便事後追蹤。掌握這套查詢技巧,即可在幾分鐘內從數百條連線中精準找出「那條忘記關閉的 SQL」,快速止血並導向程式碼修正。