Oracle 全域暫存表 (GTT) 分 ON COMMIT DELETE ROWS (交易級) 與 ON COMMIT PRESERVE ROWS (Session 級)。在 WebLogic 等連線池架構中,Session 重複使用導致 Session 級 GTT 資料累積,造成邏輯錯誤與效能下降。本文分析問題根因並給出解決方案。
-- 交易級:COMMIT 即清空
CREATE GLOBAL TEMPORARY TABLE gtt_txn (id NUMBER) ON COMMIT DELETE ROWS;
-- Session 級:Session 結束才清空
CREATE GLOBAL TEMPORARY TABLE gtt_sess (id NUMBER) ON COMMIT PRESERVE ROWS;
ON COMMIT PRESERVE ROWS 的 GTT,資料在 Session 存活期間持續累積。CREATE GLOBAL TEMPORARY TABLE gtt_txn (id NUMBER) ON COMMIT DELETE ROWS;
每次事務提交自動清空,天然適配連線池模型。
TRUNCATE TABLE gtt_sess; (需 DROP ANY TABLE 權限或建立包裝程序授權)。close() / 檢出前執行清理邏輯 (需應用框架支援)。CREATE PRIVATE TEMPORARY TABLE ora$ppt_my_temp (id NUMBER);
生命週期綁定交易或 Session,自動隔離、自動清理,無跨 Session 污染。
ON COMMIT DELETE ROWS,除非有跨事務保留資料的強需求。V$TEMPSEG_USAGE 觀察暫存段使用情況,預防臨時表空間爆滿。理解 GTT 生命週期與連線池重用機制的交互,是避免資料殘留 Bug 的關鍵。