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

Tomcat 5 配置 MySQL JNDI 數據源連接池完整指南

     編輯:J2EE

環境準備

  • Tomcat 5.x:Windows 安裝版,記住管理控制台用戶名/密碼 (tomcat-users.xml 配置 manager-gui、admin-gui 角色)
  • MySQL 4.1+/5.x:默認安裝,創建測試數據庫 SUBRDB、用戶 root/密碼
  • JDBC 驅動:mysql-connector-java-3.1.x-bin.jar (或更新版),放置於 $CATALINA_HOME/common/lib (全局共享) 與 $WEBAPP/WEB-INF/lib (應用隔雙保險)

方式一:Tomcat 管理控制台圖形化配置 (推薦新手)

  1. 啟動 Tomcat,訪問 https://localhost:8080/admin/,登錄管理員賬號
  2. 左側導航:Resources → Data Sources
  3. 右側 Data Source Actions → Create New Data Source
  4. 填寫核心參數:
    • JNDI Name:jdbc/MySQL (建議 jdbc/ 前綴,規範命名)
    • Data Source URL:jdbc:mysql://192.168.0.16:3306/SUBRDB?useUnicode=true&characterEncoding=UTF-8
    • JDBC Driver Class:com.mysql.jdbc.Driver (5.1+ 版本)
    • User Name / Password:數據庫賬號密碼
    • Max Active Connections:20 (最大活躍連接,根據壓測調整)
    • Max Idle Connections:10 (最大空閒保持)
    • Max Wait:5000 (毫秒,獲取連接超時)
    • Validation Query:SELECT 1 (MySQL 專用,驗證連接有效性)
  5. 點擊 Save → Commit Changes,配置持久化至 $CATALINA_HOME/conf/Catalina/localhost/ROOT.xml (或對應 Context 文件)

方式二:手動編輯配置文件 (生產環境推薦,版本可控)

1. 全局數據源定義 $CATALINA_HOME/conf/server.xml (GlobalNamingResources)

<GlobalNamingResources>
    <Resource name="jdbc/MySQL" auth="Container" type="javax.sql.DataSource"
              maxActive="20" maxIdle="10" maxWait="5000"
              username="root" password="yourpass"
              driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://192.168.0.16:3306/SUBRDB?useUnicode=true&characterEncoding=UTF-8"
              validationQuery="SELECT 1"
              testOnBorrow="true" testWhileIdle="true"
              timeBetweenEvictionRunsMillis="60000"
              minEvictableIdleTimeMillis="300000"/>
</GlobalNamingResources>

2. 應用級資源引用 $WEBAPP/WEB-INF/web.xml

<resource-ref>
    <description>MySQL DataSource</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. Context 關聯 $CATALINA_HOME/conf/Catalina/localhost/你的應用.xml

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

驗證測試:JSP 代碼

<%@ page import="javax.naming.*,javax.sql.*,java.sql.*" %>
<%
    Context initCtx = new InitialContext();
    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    DataSource ds = (DataSource) envCtx.lookup("jdbc/MySQL");
    
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
        conn = ds.getConnection();
        stmt = conn.createStatement();
        rs = stmt.executeQuery("SELECT '連接池測試成功' AS msg");
        if (rs.next()) {
            out.println(rs.getString("msg"));
        }
    } finally {
        if (rs != null) try { rs.close(); } catch (Exception e) {}
        if (stmt != null) try { stmt.close(); } catch (Exception e) {}
        if (conn != null) try { conn.close(); } catch (Exception e) {} // 歸還池中
    }
%>

常見坑位與排查

現象原因解決
NameNotFoundException: jdbc/MySQLJNDI 名稱不匹配、Context 未關聯檢查 web.xml res-ref-name、Context ResourceLink、server.xml Resource name 三者一致
ClassNotFoundException: com.mysql.jdbc.Driver驅動包未放入 common/lib拷貝驅動到 $CATALINA_HOME/common/lib 並重啟 Tomcat
連接獲取極慢/超時maxActive 過小、未歸還連接、數據庫連接數耗盡調大 maxActive、排查代碼 finally 歸還、檢查數據庫 max_connections
廢棄連接 (Communications link failure)數據庫主動斷開空閒連接 (wait_timeout)啟用 testOnBorrow、testWhileIdle、設置 validationQuery、配置驅逐線程
中文亂碼URL 缺少編碼參數JDBC URL 追加 ?useUnicode=true&characterEncoding=UTF-8

遷移建議:Tomcat 7/8/9/10 + HikariCP

Tomak 5 已停止維護。現代項目建議:

  1. 升級 Tomcat 9/10 (Servlet 4.0/5.0、JSP 2.3/3.0)
  2. 棄用 Tomcat 內置 DBCP 1.x,改用 HikariCP (高性能、低延遲、默認配置即生產可用)
  3. Spring Boot 專案直接 spring.datasource.hikari.* 配置,無需容器級 JNDI
  4. 微服務架構下,數據源配置下沉至應用內部,容器僅提供運行時環境
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved