| 驅動類型 | 類別名稱 | 連線 URL 格式 | 適用場景 |
|---|---|---|---|
| Type 4 (JCC) | com.ibm.db2.jcc.DB2Driver | jdbc:db2://host:port/dbname | 純 Java、跨平台、主流推薦 |
| Type 2 (Legacy) | COM.ibm.db2.jdbc.net.DB2Driver | jdbc:db2://host:port/dbname | 舊版應用、需 DB2 Client |
| Type 2 (App Driver) | com.ibm.db2.jdbc.app.DB2Driver | jdbc:db2:dbname | 本地連線、高效能 |
本文範例使用舊版 COM.ibm.db2.jdbc.net.DB2Driver,現代專案請改用 com.ibm.db2.jcc.DB2Driver (JCC 驅動)。
<!-- 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>
<%@ 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>
| 參數 | 說明 | 常用值 |
|---|---|---|
| securityMechanism | 認證機制 | 3=UID/PWD, 4=UID Only, 7=Kerberos, 15=Encrypted UID/PWD |
| currentSchema | 預設 Schema | 避免 SQL 需加 Schema 前綴 |
| sslConnection | 啟用 SSL | true/false (需 keystore/truststore) |
| retrieveMessagesFromServerOnGetMessage | 詳細錯誤訊息 | true (建議開啟) |
| progresssiveStreaming | 大物件串流 | 2 (BLOB/CLOB 串流讀取) |
| enableClientAffinitiesList | PureScale 親和性 | true (高可用叢集) |
jcc.jar (或 db2jcc.jar/db2jcc4.jar) 在 Classpathdb2bind 或確認 NULLID 套件存在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。