多系統共享資料庫時,連接池耗盡導致「ORA-12520: TNS:listener could not find available handler」頻發。本文詳解 Oracle Database Resident Connection Pool (DRCP) 的架構、核心包 DBMS_CONNECTION_POOL、關鍵參數調優與監控視圖。
SYS_DEFAULT_CONNECTION_POOLDBMS_CONNECTION_POOL 包START_POOLEXEC DBMS_CONNECTION_POOL.START_POOL('SYS_DEFAULT_CONNECTION_POOL');
後續實例重啟會自動啟動(除非手動 STOP)。
SELECT connection_pool, status FROM dba_cpool_info;
-- SYS_DEFAULT_CONNECTION_POOL ACTIVE
| 參數 | 含義 | 默認值 | 調優建議 |
|---|---|---|---|
| MINSIZE | 池中最小 Pooled Server 數 | 4 | 按基礎併發設定,如 10-20 |
| MAXSIZE | 池中最大 Pooled Server 數 | 40 | 按峰值併發設定,如 100-200 |
| INCRSIZE | 擴容步長 | 2 | 避免頻繁擴縮容,建議 5-10 |
| SESSION_CACHED_CURSORS | 每 Server 緩存游標數 | 20 | 複雜應用可調大至 50-100 |
| INACTIVITY_TIMEOUT | 空閒超時釋放 (秒) | 300 | OLTP 可縮短至 60-180 |
| MAX_THINK_TIME | 客戶端持有無操作最大時間 (秒) | 30 | 長事務應用需調大 |
| MAX_USE_SESSION | Server 最大復用次數 | 5000 | 防內存洩漏,通常保持默認 |
| MAX_LIFETIME_SESSION | Server 最大生存時間 (秒) | 3600 | 定期回收資源,建議 1800-7200 |
-- 方式 1: ALTER_PARAM (單參數熱修改)
EXEC DBMS_CONNECTION_POOL.ALTER_PARAM('', 'MINSIZE', '10');
EXEC DBMS_CONNECTION_POOL.ALTER_PARAM('', 'MAXSIZE', '100');
-- 方式 2: CONFIGURE_POOL (批量重配置)
EXEC DBMS_CONNECTION_POOL.CONFIGURE_POOL(
pool_name => 'SYS_DEFAULT_CONNECTION_POOL',
minsize => 10,
maxsize => 100,
incrsize => 5
);
注意:單池架構下 pool_name 可省略 (傳空串)。
SELECT connection_pool, status, minsize, maxsize FROM dba_cpool_info;
-- SYS_DEFAULT_CONNECTION_POOL ACTIVE 10 100
| 視圖 | 用途 |
|---|---|
| DBA_CPOOL_INFO | 池狀態、配置參數 |
| V$CPOOL_STATS | 請求/命中/等待/溢出統計 |
| V$CPOOL_CC_STATS | 連接類別級統計 (專用/共享) |
:POOLED 或屬性 oracle.net.CONNECTION_POOLING=trueOCISessionGet 指定 OCI_SESSGET_SPOOLSTOP_POOL → START_POOL 重啟 (部分參數熱修改除外)