Oracle 11g R2 環境中,批次匯入 Excel (約 1000 列) 透過 JDBC executeBatch() 更新資料時,活動 Session 數激增、等待事件飆升、整體效能惡化。本文分析 Session 激增根因、SGA/Processes 參數檢視、應用端連線池配置優化與資料庫端限流策略。
Active Sessions 從平常 < 10 飆升至 > 200。log file sync、db file sequential read、latch: cache buffers chains。executeBatch()、連線池大小未限制。SGA_TARGET=6G、PROCESSES 未調整 (預設約 300-500)。PROCESSES 參數上限。executeBatch() 預設每筆 Commit,產生大量 log file sync 等待。
maximumPoolSize=20 -- 限制同時資料庫連線數
minimumIdle=5
connectionTimeout=30000
idleTimeout=600000
maxLifetime=1800000
-- JDBC 批次優化
conn.setAutoCommit(false);
int batchSize = 500;
for (int i=0; i
-- 1. 確保 PROCESSES 足夠 (含背景進程 + 連線池上限 * 節點數 + 緩衝)
ALTER SYSTEM SET processes = 500 SCOPE=SPFILE; -- 視實際上限調整
-- 2. 調大 Redo Log Buffer 減少 log file sync
ALTER SYSTEM SET log_buffer = 10M SCOPE=SPFILE; -- 需重啟
-- 3. 確保 SGA_TARGET 包含足夠 Large Pool (共用伺服器/備份/平行)
-- ASMM 通常會自動分配,若觀察 V$SGA_RESIZE_OPS 發現 Large Pool 壓力大,可設定最小值
ALTER SYSTEM SET large_pool_size = 100M SCOPE=BOTH;
-- 4. 啟用 ASMM (若未啟用)
ALTER SYSTEM SET sga_target = 6G SCOPE=BOTH;
ALTER SYSTEM SET statistics_level = TYPICAL SCOPE=BOTH;
DISPATCHERS),減少 Process 數量。| 指標 | 優化前 | 優化後目標 | 查詢方式 |
|---|---|---|---|
| Active Sessions (批次期間) | > 200 | < 50 | SELECT COUNT(*) FROM v$session WHERE status='ACTIVE'; |
| log file sync 平均等待 | > 10ms | < 2ms | SELECT average_wait FROM v$system_event WHERE event='log file sync'; |
| PROCESSES 使用率 | > 90% | < 60% | SELECT (COUNT(*)/value)*100 FROM v$process, v$parameter WHERE name='processes'; |
| 批次匯入耗時 | 30 分鐘 | < 10 分鐘 | 應用端計時 |
executeBatch() 不等於單一交易:預設每筆 Commit,必須手動 setAutoCommit(false) 並控制批次大小。DBMS_STATS.GATHER_TABLE_STATS),否則後續查詢效能將惡化。「資料庫參數調優是下策,應用架構優化是上策」。限制連線池、控制批次 Commit、錯峰排程,三管齊下即可平穩吸收批次衝擊。