雖然現代開發推薦使用連線池與框架,但理解 JSP 直連資料庫的基礎配置過程,有助於排查連線問題、理解資料源本質。本文以 SQL Server 2000 + Tomcat 5.0 為例,梳理完整配置鏈路,並給出生產環境建議。
| 組件 | 版本/路徑 |
|---|---|
| JDK | 1.4+ |
| SQL Server | 2000 SP4 |
| Tomcat | 5.0 |
| JDBC 驅動 | Microsoft SQL Server 2000 Driver for JDBC |
msbase.jar、mssqlserver.jar、msutil.jar 至 $CATALINA_HOME/common/lib/ (Tomcat 5.x) 或 lib/ (Tomcat 6+)CLASSPATH 環境變數(不推薦,易衝突)編輯 $CATALINA_HOME/conf/server.xml,<Host> 內新增:
<Context path="/friends"
docBase="E:/eclipse/workspace/friends"
workDir="E:/eclipse/workspace/friends/work"
reloadable="true"/>
path:Web 應用上下文路徑docBase:專案物理路徑(建議使用正斜槓)reloadable:開發階段開啟,生產關閉<%@ page language="java" contentType="text/html; charset=GB2312"
import="java.sql.*" %>
<html>
<head><meta charset="GB2312"><title>SQL Server 測試</title></head>
<body>
<%
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 載入驅動
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
// 2. 連線字串
String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=zy";
conn = DriverManager.getConnection(url, "sa", "");
// 3. 建立 Statement(可滾動、唯讀)
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// 4. 執行查詢
rs = stmt.executeQuery("SELECT * FROM zyInfo");
while (rs.next()) {
out.println("ID: " + rs.getString("zyInfoID") + "<br>");
}
} catch (Exception e) {
e.printStackTrace();
} 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) {}
}
%>
</body></html>
| 問題 | 原因 | 解決 |
|---|---|---|
| ClassNotFoundException | 驅動 jar 未在 classpath | 確認 common/lib 下有三個 jar,重啟 Tomcat |
| 連線被拒絕 | SQL Server 未啟用 TCP/IP、埠號錯誤、防火牆 | SQL Server 網路工具啟用 TCP/IP 1433,telnet 測試 |
| 中文亂碼 | 字符集不匹配 | JSP pageEncoding、資料庫排序規則、JDBC URL 加 ;charset=GBK |
| 資源洩漏 | 未在 finally 關閉連線 | 嚴格遵循 try-finally 或 try-with-resources (JDK 7+) |
context.xml 或 server.xml)<Resource name="jdbc/sqlserver"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;databaseName=zy;charset=UTF-8"
username="app_user"
password="secure_pass"
maxTotal="20"
maxIdle="10"
maxWaitMillis="5000"
validationQuery="SELECT 1"
testOnBorrow="true"/>
注意:新版驅動類名為 com.microsoft.sqlserver.jdbc.SQLServerDriver (sqljdbc4.jar)
<resource-ref>
<description>SQL Server DataSource</description>
<res-ref-name>jdbc/sqlserver</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<%
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/sqlserver");
try (Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM zyInfo")) {
while (rs.next()) {
out.println(rs.getString("zyInfoID") + "<br>");
}
}
%>
JSP 直連資料庫適合學習 JDBC 基礎、快速原型驗證。生產系統必須使用容器管理資料源 + 連線池,並遵循分層架構將資料存取邏輯封裝於 DAO/Repository 層。理解底層連線建立、Statement 執行、ResultSet 游標、資源釋放全生命週期,是排查資料庫交互問題的基石。