企業級應用常需整合來自 Oracle、DB2、Excel 等異構數據源的數據。本文詳細對比兩種架構:使用 IBM DB2 Information Integrator (II) 的聯邦技術 vs 手動編寫 Servlet 直接訪問各數據源並合併結果。結論顯著:II 方案減少 40% 代碼量、開發時間減半,且性能不遜色甚至更優。
-- 建立 Wrapper、Server、User Mapping、Nickname
CREATE WRAPPER net8;
CREATE SERVER jaqora TYPE oracle VERSION 8 WRAPPER net8
AUTHORIZATION "demo" PASSWORD "cdidemo" OPTIONS (NODE 'iidemo2');
CREATE USER MAPPING FOR db2admin SERVER jaqora
OPTIONS (REMOTE_AUTHID 'demo', REMOTE_PASSWORD 'cdidemo');
CREATE NICKNAME ora_part FOR jaqora.demo.part;
-- 調整數據類型映射
ALTER NICKNAME ora_part ALTER COLUMN p_partkey LOCAL TYPE integer;
-- 建立跨源 UNION ALL 視圖(含來源標識列)
CREATE VIEW fed_part AS
SELECT db2_part.*, 'db2' AS p_server FROM db2_part
UNION ALL
SELECT ora_part.*, 'ora' AS p_server FROM ora_part
UNION ALL
SELECT odbc_part.*, 'xls' AS p_server FROM odbc_part;
II 方案(單條 SQL):
SELECT DISTINCT p_partkey, p_name, p_mfgr, p_type
FROM fed_part
WHERE p_type LIKE CAST(? AS VARCHAR(25))
AND p_name LIKE CAST(? AS VARCHAR(55))
ORDER BY p_partkey
FETCH FIRST 20 ROWS ONLY
直接訪問(4 條 SQL + Java 邏輯):
FETCH FIRST 20 ROWS ONLYROWNUM <= 20直接訪問若各源各取 TOP 10 再合併,會遺漏跨源訂單合併後進入 TOP 10 的客戶。正確做法:各源全量聚合 → 本地暫存表 → 最終聚合排序取 TOP 10。II 方案單條 SQL 自動正確處理。
直接訪問不能簡單平均各源平均值。需各源算 COUNT/SUM → 本地合併加總 → 算總平均。邏輯極其複雜,涉及 5 條 SELECT、1 INSERT、1 UPDATE、1 DELETE。II 方案單條 SQL 搞定。
| 模塊 | II 方案代碼行數 | 直接訪問代碼行數 |
|---|---|---|
| 查詢 1-3 Servlet | 289 | 521 |
| 查詢 4-5 Servlet | 280 | 430 |
直接訪問開發時間約為 II 方案 2 倍;複雜查詢(如查詢 5)差距更大。
II 方案查詢響應時間與直接訪問持平,甚至有時更優。II 全局優化器基於統計信息自動選擇最優訪問路徑,而手寫邏輯難以適應數據分佈變化。
下一篇將詳細分析性能測試數據與調優細節。