首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP 連接 DB2 資料庫完整範例與最佳實踐

     編輯:關於JSP

DB2 JDBC 驅動類型選擇

驅動類型類別名稱連線 URL 格式適用場景
Type 4 (JCC)com.ibm.db2.jcc.DB2Driverjdbc:db2://host:port/dbname純 Java、跨平台、主流推薦
Type 2 (Legacy)COM.ibm.db2.jdbc.net.DB2Driverjdbc:db2://host:port/dbname舊版應用、需 DB2 Client
Type 2 (App Driver)com.ibm.db2.jdbc.app.DB2Driverjdbc:db2:dbname本地連線、高效能

本文範例使用舊版 COM.ibm.db2.jdbc.net.DB2Driver,現代專案請改用 com.ibm.db2.jcc.DB2Driver (JCC 驅動)。

Maven 依賴配置

<!-- IBM DB2 JCC Driver (需從 IBM 下載或使用公開庫舊版) -->
<dependency>
    <groupId>com.ibm.db2</groupId>
    <artifactId>jcc</artifactId>
    <version>11.5.8.0</version>
</dependency>

<!-- 或使用 IBM Maven Repository -->
<repository>
    <id>ibm-maven</id>
    <url>https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/maven/</url>
</repository>

JSP 連線測試頁面

<%@ page
    import="java.sql.*,java.util.*,java.io.*"
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
%>
<!DOCTYPE html>
<html>
<head>
    <title>JSP 連接 DB2 測試</title>
    <meta charset="UTF-8">
</head>
<body>
<h2 style="text-align:center; color:#2c3e50;">JSP 連接 DB2 資料庫測試</h2>

<%
    // 配置參數(生產環境應從外部配置讀取)
    String host = "192.168.1.100";
    String port = "50000";
    String database = "SAMPLE";
    String user = "db2admin";
    String password = "your_secure_password";
    String driverClass = "com.ibm.db2.jcc.DB2Driver";  // JCC Driver
    String url = "jdbc:db2://" + host + ":" + port + "/" + database +
                 ":currentSchema=DB2ADMIN;securityMechanism=15;";  // 加密密碼

    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;

    try {
        // 1. 載入驅動
        Class.forName(driverClass).newInstance();
        out.println("<p style='color:green;'>✓ 驅動載入成功: " + driverClass + "</p>");

        // 2. 建立連線
        conn = DriverManager.getConnection(url, user, password);
        out.println("<p style='color:green;'>✓ 資料庫連線成功!</p>");

        // 3. 簡單查詢驗證
        stmt = conn.createStatement();
        rs = stmt.executeQuery("SELECT CURRENT SERVER, CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1");
        if (rs.next()) {
            out.println("<p>伺服器: <strong>" + rs.getString(1) + "</strong></p>");
            out.println("<p>時間戳: <strong>" + rs.getTimestamp(2) + "</strong></p>");
        }

        // 4. 取得資料庫中繼資料
        DatabaseMetaData meta = conn.getMetaData();
        out.println("<p>資料庫產品: <strong>" + meta.getDatabaseProductName() + "</strong></p>");
        out.println("<p>版本: <strong>" + meta.getDatabaseProductVersion() + "</strong></p>");
        out.println("<p>驅動名稱: <strong>" + meta.getDriverName() + "</strong></p>");
        out.println("<p>驅動版本: <strong>" + meta.getDriverVersion() + "</strong></p>");

    } catch (ClassNotFoundException e) {
        out.println("<p style='color:red;'>✗ 驅動類別找不到: " + e.getMessage() + "</p>");
        e.printStackTrace(new java.io.PrintWriter(out));
    } catch (SQLException e) {
        out.println("<p style='color:red;'>✗ SQL 錯誤 (Error Code: " + e.getErrorCode() + ", SQLState: " + e.getSQLState() + "):</p>");
        out.println("<pre style='color:red;'>" + e.getMessage() + "</pre>");
        e.printStackTrace(new java.io.PrintWriter(out));
    } catch (Exception e) {
        out.println("<p style='color:red;'>✗ 一般錯誤: " + e.getMessage() + "</p>");
        e.printStackTrace(new java.io.PrintWriter(out));
    } finally {
        // 5. 資源關閉 (逆序)
        try { if (rs != null) rs.close(); } catch (Exception ignore) {}
        try { if (stmt != null) stmt.close(); } catch (Exception ignore) {}
        try { if (conn != null) conn.close(); } catch (Exception ignore) {}
        out.println("<p style='color:gray;'>資源已釋放。</p>");
    }
%>
</body>
</html>

DB2 連線參數詳細說明

參數說明常用值
securityMechanism認證機制3=UID/PWD, 4=UID Only, 7=Kerberos, 15=Encrypted UID/PWD
currentSchema預設 Schema避免 SQL 需加 Schema 前綴
sslConnection啟用 SSLtrue/false (需 keystore/truststore)
retrieveMessagesFromServerOnGetMessage詳細錯誤訊息true (建議開啟)
progresssiveStreaming大物件串流2 (BLOB/CLOB 串流讀取)
enableClientAffinitiesListPureScale 親和性true (高可用叢集)

常見問題排查

  1. ClassNotFoundException:確認 jcc.jar (或 db2jcc.jar/db2jcc4.jar) 在 Classpath
  2. SQLCODE=-30082, SQLState=08001:認證失敗,檢查用戶/密碼、securityMechanism、LDAP/OS 認證設定
  3. SQLCODE=-4499, SQLState=08001:連線逾時,檢查防火牆、DB2 TCPIP 服務、主機/埠
  4. SQLCODE=-805, SQLState=51002:套件未綁定,執行 db2bind 或確認 NULLID 套件存在
  5. 中文亂碼:確認資料庫代碼頁 (CODEPAGE 1208/UTF-8)、JVM file.encoding=UTF-8、連線字串無編碼衝突

連線池整合範例

<!-- HikariCP 配置 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver" />
    <property name="jdbcUrl" value="jdbc:db2://host:50000/SAMPLE:currentSchema=DB2ADMIN;securityMechanism=15;" />
    <property name="username" value="${db.user}" />
    <property name="password" value="${db.password}" />
    <property name="maximumPoolSize" value="20" />
    <property name="minimumIdle" value="5" />
    <property name="idleTimeout" value="300000" />
    <property name="connectionTimeout" value="20000" />
    <property name="connectionTestQuery" value="SELECT 1 FROM SYSIBM.SYSDUMMY1" />
</bean>

結語

DB2 作為企業級資料庫,其 JDBC 整合相對成熟。關鍵在於:選對驅動類型 (JCC)、正確配置連線參數、妥善處理資源關閉、導入連線池。現代化架構下,建議將資料庫存取層封裝於 Spring Data JPA / MyBatis / JOOQ 等框架,而非直接在 JSP Scriptlet 操作 JDBC。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved