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

Tomcat 5 配置 MySQL JDBC 數據源連接池:從管理控制台到 JNDI 註冊完整指南

     編輯:Java 相關知識

環境準備

  • JDK 1.5+
  • Tomcat 5.x (Windows 安裝版,設置管理員用戶/密碼)
  • MySQL 4.0+/5.0+ (默認安裝,記錄 root 密碼)
  • JDBC 驅動:mysql-connector-java-3.0.9-stable-bin.jar (或更新版)

步驟 1:部署 JDBC 驅動

兩處部署,雙重保障:

  1. %CATALINA_HOME%\common\lib\:所有 Web 應用共享 (推薦)。
  2. WebApp\WEB-INF\lib\:應用級隔離,版本鎖定。

驅動類名:com.mysql.jdbc.Driver (舊版 org.gjt.mm.mysql.Driver 已棄用)。

步驟 2:Tomcat 管理控制台創建數據源

  1. 啟動 Tomcat,瀏覽器訪問 https://localhost:8080/admin/。
  2. 輸入安裝時設置的管理員帳號密碼登錄。
  3. 左側選單:Resources → Data Sources。
  4. 操作欄:Data Source Actions → Create New Data Source。
  5. 填寫表單:
字段示例值說明
JNDI Namejdbc/mysqlJNDI 查找名,建議 jdbc/ 前綴
Data Source URLjdbc:mysql://192.168.0.16:3306/SUBRDB主機:端口/數據庫,需開放 3306 防火牆
JDBC Driver Classcom.mysql.jdbc.Driver驅動全限定類名
User Nameroot數據庫用戶
Password******數據庫密碼
Max Active Connections20池最大活躍連接 (視業務併發調整)
Max Idle Connections10池最大空閒連接
Max Wait (ms)5000獲取連接最大等待時間
Validation QuerySELECT 1連接有效性檢查 SQL (MySQL 適用)
  1. 點擊 Save → Commit Changes。配置持久化至 %CATALINA_HOME%\conf\server.xml 的 <Resource> 元素。

步驟 3:Web 應用級 JNDI 映射

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 配置綁定全局資源

文件:%CATALINA_HOME%\conf\Catalina\localhost\.xml (如 ROOT.xml)

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

name:應用內部 JNDI 名 (java:comp/env/jdbc/mysql)
global:服務器級全局資源名 (步驟 2 定義)

步驟 4:重啟 Tomcat 生效

控制台操作修改 server.xml 需重啟服務器載入新 Resource 定義。

步驟 5:JSP 測試代碼

<%@ page import="java.sql.*, javax.sql.*, javax.naming.*" %>
<%@ page session="false" contentType="text/html;charset=GB2312" %>
<html><body>
<%
  out.print("測試開始<br>");
  try {
    InitialContext ctx = new InitialContext();
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
    Connection conn = ds.getConnection();
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM users"); // 假設表存在
    while (rs.next()) {
      out.print(rs.getString(1) + "<br>");
    }
    rs.close(); stmt.close(); conn.close(); // 歸還連接池
    out.print("測試結束");
  } catch (Exception ex) {
    out.print("異常: " + ex.getMessage() + "<br>");
    ex.printStackTrace();
  }
%>
</body></html>

常見問題排查

現象可能原因解決方案
javax.naming.NameNotFoundException: jdbc/mysqlJNDI 名不匹配、ResourceLink 缺失、Context 文件錯誤核對 web.xml res-ref-name、Context ResourceLink name/global、重啟 Tomcat
ClassNotFoundException: com.mysql.jdbc.Driver驅動 JAR 未放入 common/lib 或 WEB-INF/lib複製驅動 JAR 至兩處、重啟
Communications link failureMySQL 主機/端口錯誤、防火牆阻攔、MySQL bind-address 配置檢查 URL、telnet 3306、MySQL 配置 bind-address=0.0.0.0、授權 root@'%'
連接泄漏、池耗盡代碼未 close() 連接、異常路徑未釋放使用 try-with-resources (JDK 7+) 或 finally 塊關閉、配置 removeAbandoned=true
ValidationQuery 失敗MySQL 版本過低不支援 SELECT 1改用 SELECT 1 FROM DUAL 或升級驅動/數據庫

進階調優參數 (server.xml Resource 屬性)

<Resource name="jdbc/mysql" ... 
  maxActive="50" maxIdle="20" maxWait="10000"
  validationQuery="SELECT 1"
  testOnBorrow="true" testOnReturn="false" testWhileIdle="true"
  timeBetweenEvictionRunsMillis="60000"
  minEvictableIdleTimeMillis="300000"
  removeAbandoned="true" removeAbandonedTimeout="300"
  logAbandoned="true"
  username="root" password="secret"
  url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"
  driverClassName="com.mysql.jdbc.Driver"/>

總結

Tomcat 管理控制台提供可視化數據源配置,結合 web.xml 資源引用聲明與 Context ResourceLink 綁定,實現容器管理連接池 (Container Managed Connection Pool)。應用代碼通過標準 JNDI 查找 DataSource,零依賴特定池實現,符合 J2EE 規範,利於移植與運維分離。

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