| 驅動類別 | 包名 | 適用場景 |
com.ibm.db2.jcc.DB2Driver | db2jcc4.jar (Java 8+) | 通用生產環境,支援所有功能 |
com.ibm.db2.jcc.DB2SimpleDataSource | db2jcc4.jar | 非池化簡單連接 |
com.ibm.db2.jcc.DB2ConnectionPoolDataSource | db2jcc4.jar | 連接池 (HikariCP/DBCP/Tomcat) |
com.ibm.db2.jcc.DB2XADataSource | db2jcc4.jar | 分布式事務 (JTA) |
舊版驅動 (db2java.zip, COM.ibm.db2.jdbc.*) 已停止維護,嚴禁新項目使用。
連接 URL 標準格式
# Type 4 標準格式
jdbc:db2://:/:=;=...
# 實例
jdbc:db2://192.168.1.10:50000/MYDB:user=db2user;password=*****;clientEncoding=UTF-8;securityMechanism=13;
# 關鍵屬性
user / password 認證
clientEncoding=UTF-8 強制 UTF-8 (防中文亂碼)
securityMechanism=13 USER_AND_PASSWORD_ENCRYPTED (推薦)
sslConnection=true 啟用 SSL/TLS
currentSchema=MY_SCHEMA 當前模式
retrieveMessagesFromServerOnGetMessage=true 完整錯誤信息
enableClientAffinitiesList=1 客戶端親和性 (HADR/ACR)
原生代碼連接範例
import java.sql.*;
import javax.sql.DataSource;
import com.ibm.db2.jcc.DB2SimpleDataSource;
public class Db2ConnDemo {
public static void main(String[] args) throws Exception {
// 1. DataSource 方式 (推薦,支援連接池)
DB2SimpleDataSource ds = new DB2SimpleDataSource();
ds.setDriverType(4); // Type 4
ds.setDatabaseName("MYDB");
ds.setServerName("192.168.1.10");
ds.setPortNumber(50000);
ds.setUser("db2user");
ds.setPassword("******");
ds.setClientEncoding("UTF-8");
ds.setSecurityMechanism(com.ibm.db2.jcc.DB2BaseDataSource.USER_AND_PASSWORD_ENCRYPTED);
// 2. 獲取連接
try (Connection conn = ds.getConnection()) {
System.out.println("Connected: " + conn.getMetaData().getURL());
// 3. 執行查詢
try (PreparedStatement ps = conn.prepareStatement("SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1");
ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
System.out.println("DB Time: " + rs.getTimestamp(1));
}
}
}
}
}
JSP/Servlet 容器整合最佳實踐
1. 共享連接池 (JNDI + Tomcat/HikariCP)
2. Servlet 中集中管理連接
@WebServlet("/api/*")
public class ApiServlet extends HttpServlet {
@Resource(name = "jdbc/DB2DS")
private DataSource ds;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
try (Connection conn = ds.getConnection()) {
// 業務邏輯...
} catch (SQLException e) {
log("DB Error", e);
resp.sendError(500, "Database error");
}
}
}
核心原則:JSP 僅做展示,所有 JDBC 代碼下沉 Servlet/Service 層,避免 JSP 直接連接導致連接洩漏、事務邊界不清、性能差。
常見性能陷阱與解決
| 現象 | 根因 | 解決 |
| 首次連接極慢 (10s+) | 驅動加載、安全機制協商、DNS 反查 | 預熱連接池;securityMechanism=13;/etc/hosts 配置主機名 |
| 中文亂碼/截斷 | 客戶端/服務端/數據庫編碼不一致 | 全鏈路強制 clientEncoding=UTF-8;數據庫 CODESET UTF-8 |
| 連接洩漏導致耗盡 | JSP/舊代碼未關閉連接/ResultSet | 強制 try-with-resources;連接池 removeAbandoned=true |
| DB2 實例意外 Down / 連接緩慢 | 配置參數不當 (MAXAGENTS, MAXAPPLS, LOCKLIST) | 調優實例參數;啟用 DB2_AVOID_PREFETCH 等注冊表變量 |
進階:pureXML / XQuery 支援
// 插入 XML 文檔
String xml = "張三30";
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO PATIENTS (DATA) VALUES (XMLPARSE(DOCUMENT ?))")) {
ps.setString(1, xml);
ps.executeUpdate();
}
// XQuery 查詢
try (PreparedStatement ps = conn.prepareStatement(
"SELECT XMLQUERY('$d/patient/name/text()' PASSING DATA AS \"d\") FROM PATIENTS WHERE XMLQUERY('$d/patient/age > 25' PASSING DATA AS \"d\") = 1")) {
ResultSet rs = ps.executeQuery();
// 處理 XML 結果...
}
依賴管理
com.ibm.db2
jcc
11.5.8.0
遵循「Type 4 驅動 + 連接池 + Servlet 集中化 + 全鏈路 UTF-8」四大原則,構建穩定高效的 DB2 Java 應用。
- 上一篇文章: DB2 數據庫設計精要:語言環境選擇、字符集規劃與安裝最佳實踐
- 下一篇文章: Oracle 與 DB2 數據類型映射全對照表:遷移開發必備速查手冊
Copyright ©
程式碼之家 All Rights Reserved