首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

JDBC 連接 DB2 完全指南:連接串、驅動選型、JSP/Servlet 最佳實踐與性能調優

     編輯:DB2 教學

驅動架構與選型

DB2 提供 Type 4 純 Java 驅動 (JCC Driver),單一 JAR 支援本地/遠程、DataSource/XA、pureXML、SSL。無需 客戶端軟件安裝。

舊版驅動 (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 直接連接導致連接洩漏、事務邊界不清、性能差。

常見性能陷阱與解決

驅動類別包名適用場景
com.ibm.db2.jcc.DB2Driverdb2jcc4.jar (Java 8+)通用生產環境,支援所有功能
com.ibm.db2.jcc.DB2SimpleDataSourcedb2jcc4.jar非池化簡單連接
com.ibm.db2.jcc.DB2ConnectionPoolDataSourcedb2jcc4.jar連接池 (HikariCP/DBCP/Tomcat)
com.ibm.db2.jcc.DB2XADataSourcedb2jcc4.jar分布式事務 (JTA)

進階: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 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象根因解決
首次連接極慢 (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 等注冊表變量