| 驅動類型 | 類別名稱 | 適用場景 | 需安裝 DB2 Client |
|---|---|---|---|
| Type 2 (APP) | COM.ibm.db2.jdbc.app.DB2Driver | 本機連線、效能極致要求 | 是 |
| Type 4 (NET) | COM.ibm.db2.jdbc.net.DB2Driver | 遠端連線、無 Client 環境、容器化部署 | 否 |
| Type 4 (JCC - 推薦) | com.ibm.db2.jcc.DB2Driver | 通用型、功能最全、支援 XA、DataSource、連線池 | 否 |
現代專案請統一使用 JCC 驅動com.ibm.db2.jcc.DB2Driver(db2jcc.jar),舊版 APP/NET 驅動已停止更新。
# Type 2 本地
jdbc:db2:SAMPLE
# Type 4/JCC 遠端標準
jdbc:db2://192.168.1.10:50000/SAMPLE
# 進階參數(常用)
jdbc:db2://192.168.1.10:50000/SAMPLE:
retrieveMessagesFromServerOnGetMessage=true;
enableSysplexWLB=true;
currentSchema=MYSchema;
作者實測發現:在 JSP 頁面直接建立 Connection、執行查詢,回應時間極長。根因:
MAXAPPLS、MAX_COORDAGENTS)未調優,連線風暴導致引擎阻塞。// 1. 啟動時初始化 DataSource (ServletContextListener / Spring Boot 自動配置)
HikariConfig cfg = new HikariConfig();
cfg.setJdbcUrl("jdbc:db2://192.168.1.10:50000/SAMPLE");
cfg.setUsername("db2admin");
cfg.setPassword("admin");
cfg.setDriverClassName("com.ibm.db2.jcc.DB2Driver");
cfg.setMaximumPoolSize(20);
DataSource ds = new HikariDataSource(cfg);
// 2. Service/DAO 注入 DataSource,獲取連線即用即還
public List getOrders(String custId) {
String sql = "SELECT * FROM ORDERS WHERE CUST_ID = ?";
try (Connection c = ds.getConnection();
PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, custId);
try (ResultSet rs = ps.executeQuery()) {
return mapRows(rs);
}
}
}
// 3. JSP/Controller 僅呼叫 Service,零資料庫程式碼
db2jcc.jar、db2jcc_license_cu.jar 放入 $CATALINA_HOME/lib(共享類載入器),而非 WAR 內 WEB-INF/lib,避免類別衝突與記憶體洩漏。context.xml 定義 <Resource name="jdbc/DB2DS" type="javax.sql.DataSource" .../>,應用透過 JNDI 查詢,實現配置與程式碼分離。| 參數 | 建議值 | 說明 |
|---|---|---|
| MAXAPPLS | 連線池上限 × 實例數 + 閒置 | 最大併發應用程式數 |
| MAX_COORDAGENTS | MAXAPPLS × 1.2 | 協調代理程式上限 |
| MAXAGENTS | MAX_COORDAGENTS + 100 | 總代理程式上限 |
| NUM_POOLAGENTS | 預估峰值併發 | 代理程式池預熱數量 |
| APP_CTL_HEAP_SZ | 1024 (4KB pages) | 應用控制堆疊,防止複雜 SQL OOM |
JDBC 連線 DB2 不難,難在架構選型與參數調優:
1. 統一用 JCC Type 4 驅動
2. 連線池前置(HikariCP/DBCP2),嚴禁 JSP/Controller 直連
3. Tomcat 共享 lib + JNDI DataSource
4. 依負載調整 DB2 代理程式與堆疊參數
落實以上四點,即可消除「連線慢、易斷線、併發上不去」的常見痛點。