資料庫資源洩漏是 Java 應用程式常見卻難以察覺的問題,可能導致 DB2 伺服器負載過大、應用程式異常甚至崩潰。本文將示範如何結合 IBM DB2 的 JDBC 追蹤功能與 Eclipse Modeling Framework (EMF),建立一套自動化分析機制,快速定位未正確關閉的連線、陳述式與結果集,大幅縮減人工檢視追蹤檔的時間成本。
DB2 Universal JDBC Driver 內建的追蹤功能,能記錄應用程式對資料庫的每一次互動:連線建立、SQL 執行、結果集存取、以及關鍵的 close() 呼叫。啟用方式只需在 JDBC URL 附加三個參數:
每個實體連線會產生一個獨立追蹤檔,內容包含時間戳、執行緒、物件參考位址等詳細資訊,例如:
[ibm][db2][jcc][Time:1250166698906][Thread:main][Connection@67df5ee8] prepareStatement (select OBJ_ID from SCHEMA_NAME.OBJECT_CLASS where CLASSNAME=?) called
[ibm][db2][jcc][Time:1250166698906][Thread:main][PreparedStatement@6d0f1ee0] setObject (1, Java.lang.String) called
[ibm][db2][jcc][Time:1250166698906][Thread:main][PreparedStatement@6d0f1ee0] close () called <-- 關鍵資訊
原始追蹤檔屬於領域特定語言 (DSL),結構雖固定但非 XML,難以直接用通用工具解析。EMF 提供完整的模型驅動架構:定義模型 → 自動產生編輯器、視圖、持久化程式碼。我們只需:
Resource.Factory 註冊至 EMF 登記表完成後,任何 DB2 追蹤檔皆可在 Eclipse 中以樹狀結構開啟,屬性視窗即時顯示每個資源的 closeCalled 狀態,如圖所示:

核心實體包含:DB2ServerMetadata、ConnectionInfo、Statement、PreparedStatement、ResultSet,皆繼承自 ResourceElement 並擁有 id、closeCalled 等屬性。
解析器逐行掃描追蹤檔,使用正規表示式擷取:
\[Connection@<id>\]createStatement / prepareStatement\[ResultSet@<id>\]\[<ResourceId>\] close \(\) called解析器即時建立模型物件並設定屬性,最後由自訂 MyCustomDB2TraceResourceFactoryImpl 回傳 Resource 實例:
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap()
.put("trc", new MyCustomDB2TraceResourceFactoryImpl());
開啟追蹤檔後,在樹狀視圖篩選 closeCalled = false 的節點,即可鎖定疑似洩漏資源。圖 3 示範一個連線物件的 Close Called 為 false,表示應用程式未釋放該連線:

結合 DB2 追蹤與 EMF,將非結構化文字轉為可視覺化、可查詢的模型,讓資源洩漏偵測從「大海撈針」變為「按圖索驥」。此架構亦可延伸至效能分析、稽核追蹤等場景,展現模型驅動工程在運維領域的實用價值。