DB2 9 for Linux, UNIX, and Windows(原代號 Viper)引入混合引擎,便利 XML 與關聯資料整合。本文聚焦對 Java 應用開發至關重要的新特性。
DB2 9 在多平台支援 Java 5.x,開發者可利用 Unicode 增補字元支援、增強 for 迴圈、泛型、型別安全列舉、可變參數等新特性開發 DB2 Java 應用與 Java 例程。
DB2 9 中 DB2 Driver for JDBC and SQLJ(JCC 驅動)為 Java 應用預設驅動。DB2 JDBC Type 2 驅動不再推薦,Type 3 驅動已棄用。若欲用 JCC 驅動作為 Java 例程執行期預設驅動,可設定登錄變數 DB2_USE_DB2JCCT2_JROUTINE=ON(預設未設定)。
隨 DB2 9 發布的增強版 JCC 驅動遵循 JDBC 3.0 規範,新增支援:

JDBC 標準尚未包含原生 XML 型別,DB2 9 將 XML 欄位映射為 Java String、byte 陣列、Stream 及新的 com.ibm.db2.jcc.DB2Xml 型別。表 1 列出插入/更新 XML 欄位的方法與輸入型別;表 2 列出檢索 XML 資料的方法、輸出型別與編碼宣告差異(DB2Xml.getDB2XmlXXX 含 XML 宣告與編碼,DB2Xml.getDB2XXX 不含)。

範例使用 Unicode 建立的 SAMPLE 資料庫,執行 db2sampl_XML.db2 腳本建立表、插入 XML 資料、註冊 XML Schema。CUSTOMER 表定義含兩個 XML 欄位 Info、History。
InsertSelect.java 應用程式示範:
ResultSetMetaData.getColumnTypeName 取得 XML 欄位型別XMLVALIDATE 函數驗證 customer1006.xml 檔案資料寫入 Info 欄ResultSet.getObject 與 DB2Xml.getDB2XmlString 透過 XQuery 檢索所有客戶姓名驅動會在輸出中加入 ISO-10646-UCS-2 編碼宣告。
DB2 9 支援在 Java 預存程序中回傳 XML 結果集或使用 XML 參數。範例展示以 XQuery 檢索 XML 資料並以 DB2XML 輸出參數回傳值,查詢居住於安大略省 Markham 的客戶資訊。
DB2 UDB V8 問題:僅支援整個實例中單一同名 Java 類別檔案。類別載入器搜尋 CLASSPATH 指定的 JAR,選擇首個遇到的同名類別。若不同路徑存在同名類別的不同 JAR,DB2 僅載入一個類別,卻可能非對應例程所需類別,導致錯誤結果。衝突源於例程主體通常存放於 sqllib/function 目錄(實例中所有資料庫共用),且類別解析期間未使用 JAR ID。
DB2 9 解決方案:Java 類別載入器重新設計。每當請求選擇載入類別時,必須提供 JAR ID 與類別 ID,載入器嘗試在指定 JAR 中尋找類別,確保總是載入正確類別。指定 JAR ID 亦能提升搜尋效能。
CREATE PROCEDURE 的 EXTERNAL NAME 子句可指定 JAR ID、類別 ID、方法 ID。發出陳述式時類別與方法可不存在,但呼叫預存程序時必須存在且可被資料庫伺服器存取,否則報錯(SQLSTATE 42884)。若指定 JAR ID,發出陳述式時該 JAR 必須已存在。未指定 JAR ID 時維持 V8 不確定載入行為。
實測 QUERYSTAFF 與 QUERYORG 兩個預存程序(同類別名 Query、不同 JAR)在 DB2 9 中正確載入對應類別,V8 中會載入錯誤類別導致輸出截斷。
最佳實踐:將類別檔案打包至 JAR,在 EXTERNAL NAME 指定 JAR ID。若已有 JAR 但未指定 JAR ID,可用 ALTER PROCEDURE 或 ALTER FUNCTION 新增/修改 JAR ID 欄位。
本文介紹 DB2 9 多項 Java 應用支援特性,更多細節請參考官方文件。