首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Tomcat 5 配置 MySQL JDBC 連接池(JNDI DataSource)完整教程

     編輯:MySQL 資料庫相關知識

架構圖解

Web App (JSP/Servlet)
    │  lookup("java:comp/env/jdbc/MySQL")
    ▼
Tomcat Container (Naming Service)
    │  ResourceRef → ResourceLink → Global Resource
    ▼
GlobalNamingResources (server.xml)
    │  DataSource 配置:Driver、URL、Pool 參數
    ▼
MySQL Database (Connector/J 驅動)

前置條件

  • JDK 1.4+ / 1.5+
  • Tomcat 5.0 / 5.5
  • MySQL 4.0 / 4.1 / 5.0
  • MySQL Connector/J 3.0.9+(mysql-connector-java-3.0.9-stable-bin.jar)

步驟 1:部署 JDBC 驅動

# 兩處皆需放置(共享庫 + 應用隔離備選)
cp mysql-connector-java-3.0.9-stable-bin.jar $CATALINA_HOME/common/lib/
cp mysql-connector-java-3.0.9-stable-bin.jar $CATALINA_HOME/webapps/your-app/WEB-INF/lib/

差異:common/lib 供所有 Webapp 共享;WEB-INF/lib 應用獨享,版本衝突時優先。

步驟 2:配置全局 DataSource (server.xml / 管理控制台)

方式 A:Web 管理控制台(圖形化)

  1. 啟動 Tomcat → https://localhost:8080/admin/ → 輸入安裝時設置的管理員帳號密碼。
  2. Resources → Data Sources → Create New Data Source。
  3. 填寫關鍵字段:
    字段示例值說明
    JNDI Namejdbc/MySQL全局唯一,應用 lookup 時用
    Data Source URLjdbc:mysql://192.168.0.16:3306/SUBRDBIP/主機名 + 端口 + 數據庫
    JDBC Driver Classorg.gjt.mm.mysql.DriverConnector/J 3.x 類名;5.1+ 為 com.mysql.jdbc.Driver
    User Nameroot數據庫用戶
    Password******數據庫密碼
    Max Active Connections4池最大活躍連接
    Max Idle Connections2池最大閒置連接
    Max Wait (ms)500獲取連接最長等待
    Validation QuerySELECT 1連接有效性檢查(MySQL 推薦)
  4. Save → Commit Changes。

方式 B:直接編輯 server.xml(生產環境推薦,版本可控)

<GlobalNamingResources>
  <Resource name="jdbc/MySQL"
            auth="Container"
            type="javax.sql.DataSource"
            maxActive="4"
            maxIdle="2"
            maxWait="500"
            username="root"
            password="your_password"
            driverClassName="org.gjt.mm.mysql.Driver"
            url="jdbc:mysql://192.168.0.16:3306/SUBRDB"
            validationQuery="SELECT 1"
            testOnBorrow="true"
            removeAbandoned="true"
            removeAbandonedTimeout="60"
            logAbandoned="true" />
</GlobalNamingResources>

步驟 3:聲明資源引用

3.1 web.xml(應用級聲明)

<resource-ref>
  <description>MySQL Connection Pool</description>
  <res-ref-name>jdbc/MySQL</res-ref-name>  <!-- 必須與 JNDI Name 一致 -->
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

3.2 context.xml(Context 級綁定)

位置:$CATALINA_HOME/conf/Catalina/localhost/your-app.xml 或應用 META-INF/context.xml

<Context ...>
  <ResourceLink name="jdbc/mysql"
                global="jdbc/MySQL"
                type="javax.sql.DataSource" />
</Context>

注意:name 是應用內部 JNDI 名(java:comp/env/jdbc/mysql),global 指向全局資源名。

步驟 4:重啟 Tomcat 驗證

$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/startup.sh
# 查看 logs/catalina.out 確認無 DataSource 錯誤

步驟 5:JSP 測試代碼

<%@ page import="java.sql.*, javax.sql.*, javax.naming.*" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<html><body>
<h2>MySQL 連接池測試</h2>
<%
    InitialContext ctx = new InitialContext();
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
    Connection conn = ds.getConnection();
    try {
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT VERSION() AS ver, NOW() AS now");
        if (rs.next()) {
            out.println("MySQL 版本: " + rs.getString("ver") + "<br>");
            out.println("服務器時間: " + rs.getTimestamp("now") + "<br>");
        }
        rs.close();
        stmt.close();
    } finally {
        conn.close();  // 歸還池,而非關閉物理連接
    }
%>
</body></html>

常見問題排查表

現象原因解決
NameNotFoundException: jdbc/MySQLJNDI 名不匹配檢查 web.xml res-ref-name、context.xml name、server.xml Resource name 三者一致
ClassNotFoundException: org.gjt.mm.mysql.Driver驅動包未放 common/lib複製 jar 到 common/lib 並重啟 Tomcat
Communications link failureURL 錯誤/防火牆/MySQL bind-address檢查 IP、端口、MySQL bind-address=0.0.0.0、安全組
連接泄漏(池耗盡)未在 finally 關閉 Connection強制 removeAbandoned="true"、代碼規範 try-with-resources (JDK 7+)
驗證查詢報錯Validation Query 不兼容MySQL 用 SELECT 1,Oracle 用 SELECT 1 FROM DUAL

生產環境調優建議

  • 池大小:maxActive = (CPU核數 * 2) + 有效磁盤數 經驗公式,再壓測微調。
  • 驗證策略:testOnBorrow=true + validationQuery=SELECT 1;高併發可改 testWhileIdle=true + timeBetweenEvictionRunsMillis=30000。
  • 棄用連接回收:removeAbandoned=true + removeAbandonedTimeout=60 + logAbandoned=true。
  • 監控指標:JMX 暴露 NumActive、NumIdle、MaxWaitTime,接入 Prometheus/Grafana 告警。

總結

Tomcat 5 配置 MySQL JNDI 連接池的核心鏈路是:驅動部署 → 全局 Resource 定義 → web.xml resource-ref 聲明 → Context ResourceLink 綁定 → 應用 lookup 使用。掌握這條鏈路,任意數據庫(Oracle、PostgreSQL、SQL Server)只需換驅動、改 URL、調驅動類名即可復用。生產環境務必配合連接池監控、驗證查詢、棄用回收三件套,避免連接泄漏拖垮整個應用集群。

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