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

解決 ORA-12519:調整 Oracle Processes 參數提升並發連線上限

     編輯:Oracle 資料庫相關知識

應用出現 ORA-12519: TNS:no appropriate service handler found,通常因資料庫程序數達到 PROCESSES 參數上限,導致 PMON 向監聽器回報 BLOCKED 狀態,拒絕新連線。本文提供診斷查詢與線上調整步驟。

錯誤成因

  • 監聽器依據 PMON 定期(預設約 60 秒)發送的 SERVICE_UPDATE 判斷負載。
  • 當目前連線數 ≥ PROCESSES 時,服務處理器狀態轉為 BLOCKED,回傳 ORA-12519 或 ORA-12516。
  • SERVICE_UPDATE 有間隔,監聽器顯示連線數可能略低於實際值。

快速診斷查詢

-- 1. 目前使用中的程序數
SELECT COUNT(*) FROM v$process;

-- 2. PROCESSES 參數上限
SELECT value FROM v$parameter WHERE name = 'processes';

-- 3. 啟動以來最高並發連線數(高水位)
SELECT MAX(utilization) FROM v$resource_limit WHERE resource_name = 'processes';

調整 PROCESSES 參數(需重啟實例)

-- 1. 修改 SPFILE(永久生效)
ALTER SYSTEM SET processes = 500 SCOPE = SPFILE;

-- 2. 重啟資料庫
SHUTDOWN IMMEDIATE;
STARTUP;

-- 3. 驗證
SELECT value FROM v$parameter WHERE name = 'processes';

注意:PROCESSES 為靜態參數,SCOPE=SPFILE 並重啟後生效;SESSIONS 通常自動推導為 1.1 * PROCESSES + 5,同步調大。

查看目前連線使用者與高耗 SQL

SELECT
  s.osuser,
  s.username,
  s.machine,
  s.program,
  s.logon_time,
  sq.sql_text,
  sq.executions,
  sq.elapsed_time / 1e6 / NULLIF(sq.executions,0) AS avg_elapsed_sec
FROM v$session s
LEFT JOIN v$sql sq ON s.sql_id = sq.sql_id
WHERE s.type = 'USER'
ORDER BY s.logon_time;

長期對策

  1. 連線池:應用端務必使用連線池(HikariCP、DBCP、Tomcat JDBC Pool),避免頻繁建立/銷毀連線。
  2. 監控告警:設定 v$resource_limit 使用率 > 80% 觸發告警。
  3. 定期檢視:AWR / ASH 觀察 logons cumulative 趨勢,預估成長。

參數關係圖

PROCESSES (靜態) → SESSIONS (衍生) → TRANSACTIONS (衍生)
建議:PROCESSES 設為預估峰值連線數 * 1.3 ~ 1.5
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved