需更新 1,100 筆資料,已將 processes=1200、sessions=1325,但 Tomcat 仍報 ORA-12518。查詢 v$process 356、v$session 352,遠低於設定上限。根因有二:Listener 狀態同步延遲與應用端連線洩漏。
SQL> SHOW PARAMETER processes; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ processes integer 1200 SQL> SELECT * FROM v$resource_limit; RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION LIMIT_VALUE ------------------ ------------------- --------------- ------------------ ----------- processes 24 366 1200 1200 sessions 27 362 1325 1325
當前使用僅 24 processes、27 sessions,歷史峰值 366/362,均未達上限。
ORA-12518ORA-00020-- 查看 PMON 註冊間隔(單位:秒) SELECT value FROM v$parameter WHERE name = 'local_registration_address'; -- 或檢查 listener.ora 中的 SUBSCRIBE_FOR_NODE_DOWN_EVENT_設定
finally 關閉 Connection/Statement/ResultSetvalidationQuery、testOnBorrowmaxActive、maxIdle、maxWaitlistener.ora 加入 SUBSCRIBE_FOR_NODE_DOWN_EVENT_=OFF 減少註冊頻率干擾RATE_LIMIT 限制連線轉交速率ulimit -n、/etc/security/limits.conf 調大檔案描述符上限TcpTimedWaitDelay、MaxUserPort 優化 TIME_WAIT 回收| 錯誤代碼 | 來源 | 觸發條件 | 典型場景 |
|---|---|---|---|
| ORA-12518 | Listener | Listener 認為無法轉交(負載滿、同步延遲、OS 限制) | 連線風暴、連線洩漏、PMON 同步延遲 |
| ORA-00020 | Database | 實際 Session/Process 達上限 | 真正連線耗盡、processes 設定過小 |
-- 即時監控 Listener 負載
lsnrctl services
lsnrctl status
-- 即時監控 DB 連線
SELECT COUNT(*) FROM v$session;
SELECT COUNT(*) FROM v$process;
SELECT * FROM v$resource_limit WHERE resource_name IN ('processes','sessions');
結論:單純調大
processes/sessions只解決資料庫端上限,無法解決 Listener 同步延遲與應用端洩漏。必須從應用程式碼、連線池、OS、Listener 多層面聯合治理。