眾多開發者在 JSP 中連接 DB2 時遭遇 ClassNotFoundException、No suitable driver 或中文亂碼等問題。網上流傳的代碼多使用 Class.forName() 隱式加載驅動,實際上 DB2 類似 Oracle,顯式創建驅動實例並註冊到 DriverManager 才是穩健之道。本文基於 AIX 4.3 + DB2 7.2 + JDK 1.3 + Tomcat 4.1.6 實測環境,提供經過驗證的完整範例與避坑指南。
<%@ page session="false" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<html><head></head><body>
<%
String url = "jdbc:db2:ch"; // jdbc:子協議:數據庫別名
String user = "db2inst1"; // 實例用戶
String password = "db2inst1"; // 實例密碼
// 核心:顯式註冊 DB2 Type 2 驅動
DriverManager.registerDriver(new COM.ibm.db2.jdbc.app.DB2Driver());
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "select * from task";
ResultSet rs = stmt.executeQuery(sql);
%>
<table border=1 cellspacing=1 cellpadding=0>
<%
while (rs.next()) {
%>
<tr>
<td><%=rs.getString(1)%></td>
<td><%=rs.getString(2)%></td>
<td><%=rs.getString(3)%></td>
<td><%=rs.getString(4)%></td>
<td><%=rs.getString(5)%></td>
<td><%=rs.getString(6)%></td>
</tr>
<%
}
rs.close(); rs = null;
stmt.close(); stmt = null;
} finally {
if (conn != null) { conn.close(); }
}
%>
</table>
</body></html>
DriverManager.registerDriver(new COM.ibm.db2.jdbc.app.DB2Driver()),Class.forName("COM.ibm.db2.jdbc.app.DB2Driver") 在某些 Web 容器類加載器下會失效。jdbc:db2:<數據庫別名>,別名需在 DB2 客戶端配置(db2 catalog database)一致。SQLException 並記錄 SQLState、ErrorCode,便於排查鎖超時(-911)、死鎖(-913)等錯誤。file.encoding 需一致,建議在連接屬性指定 charSet=UTF-8。javax.sql.DataSource + 連接池(如 DBCP、HikariCP),配置 validationQuery="SELECT 1 FROM SYSIBM.SYSDUMMY1"。DB2BaseDataSource.setReadOnly(true) 降低鎖開銷。stmt.setFetchSize(1000) 減少網絡往返。