驅動架構與選型
| 驅動類型 | 類別 | 部署需求 | 適用場景 | 性能 |
| Type 2 (APP) | COM.ibm.db2.jdbc.app.DB2Driver | 客戶端安裝 DB2 Client (含 CLI) | 本地連接、高性能、需 DB2 Client 功能 | 最佳 (共享記憶體/IPC) |
| Type 4 (NET) | COM.ibm.db2.jdbc.net.DB2Driver | 純 Java,無需 DB2 Client | 遠程連接、應用服務器、容器化部署 | 良好 (Socket 通訊) |
| Type 4 (JCC) | com.ibm.db2.jcc.DB2Driver (JCC 通用驅動) | 單一 db2jcc4.jar (+ db2jcc_license_cu.jar) | 現代首選,支援所有平台、XA、DataSource、連接池 | 優秀 (原生協議) |
強烈建議:全面遷移至 JCC 驅動 (db2jcc4.jar),舊驅動已停止更新。
連接 URL 格式
| 模式 | URL 範本 | 範例 |
| Type 2 本地 | jdbc:db2:<database_alias> | jdbc:db2:sample |
| Type 4 遠程 | jdbc:db2://<host>:<port>/<database>[:property=value...] | jdbc:db2://192.168.1.10:50000/sample:retrieveMessagesFromServerOnGetMessage=true; |
| JCC DataSource | 程式化屬性設定 | ds.setServerName("host"); ds.setPortNumber(50000); ds.setDatabaseName("sample"); |
關鍵連接屬性
# 常用屬性
user=db2inst1
password=passwd
currentSchema=MYSCHEMA # 設定默認 Schema
securityMechanism=3 # 3=USER_ONLY, 9=ENCRYPTED_PASSWORD
sslConnection=true # SSL 加密
sslTrustStoreLocation=/path/truststore.jks
sslTrustStorePassword=changeit
blockingReadConnectionTimeout=30 # 秒
clientProgramName=MyApp # 識別應用,便於監控
類庫部署
獨立應用 / 命令列
- 將
db2jcc4.jar、db2jcc_license_cu.jar 加入 Classpath。
- 或解壓
db2java.zip (舊版) 獲取 COM/ibm/db2/jdbc/... 目錄結構。
Web 應用 (Tomcat / WebSphere / Spring Boot)
- Tomcat:JAR 放入
$CATALINA_HOME/lib (共享) 或 WEB-INF/lib (應用隔離)。不要改名為 .jar,保持原名。
- WebSphere:共享庫關聯至應用/服務器類加載器。
- Spring Boot:Maven 依賴
com.ibm.db2:jcc:11.5.9.0 (從 Maven Central 或 IBM 專有倉庫獲取)。
代碼範例:標準連接模式
// 1. 註冊驅動 (JDBC 4.0+ 可省略,自動 SPI 發現)
Class.forName("com.ibm.db2.jcc.DB2Driver");
// 2. 獲取連接
String url = "jdbc:db2://192.168.1.10:50000/sample";
Properties props = new Properties();
props.setProperty("user", "db2inst1");
props.setProperty("password", "passwd");
props.setProperty("currentSchema", "MYAPP");
Connection conn = DriverManager.getConnection(url, props);
// 3. 使用連接池 (生產必備) - HikariCP 範例
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
config.setUsername("db2inst1");
config.setPassword("passwd");
config.addDataSourceProperty("currentSchema", "MYAPP");
config.setMaximumPoolSize(20);
DataSource ds = new HikariDataSource(config);
JSP/Servlet 架構最佳實踐
- 禁用 JSP 直連資料庫:JSP 中直寫 JDBC 代碼極難維護、連接管理混亂、效能差。
- 採用 Servlet + DataSource + 連接池:
web.xml 或 context.xml 定義 JNDI DataSource (Tomcat: Resource 標籤)。
- Servlet
init() 查詢 DataSource:InitialContext().lookup("jdbc/myDB")。
- 請求處理:
try (Connection c = ds.getConnection()) { ... } 自動歸還連接。
- JSP 僅負責渲染,從 Request/Session 獲取 Servlet 準備的數據模型。
- 集中異常處理、事務邊界、SQL 審計 在 Servlet/Filter 層實現。
常見坑點與解決
| 現象 | 原因 | 解決 |
| ClassNotFoundException: COM.ibm.db2.jdbc.app.DB2Driver | 類庫未在 Classpath、JAR 損壞、版本不匹配 | 改用 JCC 驅動 db2jcc4.jar,確認 JAR 完整 |
| 連接極慢 / 間歇性掛起 | DB2 服務器端配置不當 (MAXAGENTS, MAX_COORDAGENTS)、防火牆、DNS 反解析慢 | 調整 DBM CFG、關閉 DNS 反查、檢查網路 |
| 中文亂碼 | 字符集不匹配、JVM file.encoding、資料庫代碼頁 | 統一 UTF-8:資料庫 CODEPAGE 1208、JVM -Dfile.encoding=UTF-8、連接屬性 characterEncoding=UTF-8 |
| XA 事務失敗 | 缺少 db2jcc_license_cu.jar、未啟用 XA 支援 | 添加授權 JAR、DataSource 實現 XADataSource |
結語
JDBC 連接 DB2 的現代標準是:JCC 驅動 (db2jcc4.jar) + Type 4 URL + 連接池 (HikariCP) + JNDI DataSource + Servlet 架構。拋棄舊驅動、拋棄 JSP 直連、拋棄手動連接管理。將資料庫訪問封裝於 Repository/DAO 層,配合 Spring 事務管理,構建可維護、高效能、雲原生就緒的數據訪問層。