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

JSP 連接 SQL Server 實戰教程:JDBC 驅動配置、Tomcat 資料源與最佳實踐

     編輯:Java 相關知識

雖然現代開發推薦使用連線池與框架,但理解 JSP 直連資料庫的基礎配置過程,有助於排查連線問題、理解資料源本質。本文以 SQL Server 2000 + Tomcat 5.0 為例,梳理完整配置鏈路,並給出生產環境建議。

環境準備

組件版本/路徑
JDK1.4+
SQL Server2000 SP4
Tomcat5.0
JDBC 驅動Microsoft SQL Server 2000 Driver for JDBC

步驟 1:JDBC 驅動部署

  1. 複製 msbase.jar、mssqlserver.jar、msutil.jar 至 $CATALINA_HOME/common/lib/ (Tomcat 5.x) 或 lib/ (Tomcat 6+)
  2. 或配置系統 CLASSPATH 環境變數(不推薦,易衝突)

步驟 2:Tomcat 虛擬主機配置

編輯 $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:開發階段開啟,生產關閉

步驟 3:JSP 直連程式碼(教學用)

<%@ 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+)

生產環境最佳實踐:JNDI 資料源 + 連線池

1. Tomcat 配置資料源 (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)

2. web.xml 宣告資源引用

<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>

3. JSP 使用資料源

<%
    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>");
        }
    }
%>

架構演進建議

  1. 移除 JSP 中 Java 代碼:採用 Servlet + JSP (Model 2) 或 Spring MVC
  2. 引入 ORM 框架:MyBatis/Hibernate/JPA,消除手寫 SQL/JDBC 重複代碼
  3. 連線池優化:HikariCP (高效能)、Druid (監控強)
  4. 配置外部化:Spring Profiles / @ConfigurationProperties,環境隔離

總結

JSP 直連資料庫適合學習 JDBC 基礎、快速原型驗證。生產系統必須使用容器管理資料源 + 連線池,並遵循分層架構將資料存取邏輯封裝於 DAO/Repository 層。理解底層連線建立、Statement 執行、ResultSet 游標、資源釋放全生命週期,是排查資料庫交互問題的基石。

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