mysql-connector-java-3.0.9-stable-bin.jar (或更新版)兩處部署,雙重保障:
%CATALINA_HOME%\common\lib\:所有 Web 應用共享 (推薦)。WebApp\WEB-INF\lib\:應用級隔離,版本鎖定。驅動類名:com.mysql.jdbc.Driver (舊版 org.gjt.mm.mysql.Driver 已棄用)。
https://localhost:8080/admin/。| 字段 | 示例值 | 說明 |
|---|---|---|
| JNDI Name | jdbc/mysql | JNDI 查找名,建議 jdbc/ 前綴 |
| Data Source URL | jdbc:mysql://192.168.0.16:3306/SUBRDB | 主機:端口/數據庫,需開放 3306 防火牆 |
| JDBC Driver Class | com.mysql.jdbc.Driver | 驅動全限定類名 |
| User Name | root | 數據庫用戶 |
| Password | ****** | 數據庫密碼 |
| Max Active Connections | 20 | 池最大活躍連接 (視業務併發調整) |
| Max Idle Connections | 10 | 池最大空閒連接 |
| Max Wait (ms) | 5000 | 獲取連接最大等待時間 |
| Validation Query | SELECT 1 | 連接有效性檢查 SQL (MySQL 適用) |
%CATALINA_HOME%\conf\server.xml 的 <Resource> 元素。<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>
文件:%CATALINA_HOME%\conf\Catalina\localhost\ (如 ROOT.xml)
<Context ...>
<ResourceLink name="jdbc/mysql"
global="jdbc/mysql"
type="javax.sql.DataSource"/>
</Context>
name:應用內部 JNDI 名 (java:comp/env/jdbc/mysql)
global:服務器級全局資源名 (步驟 2 定義)
控制台操作修改 server.xml 需重啟服務器載入新 Resource 定義。
<%@ 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/mysql | JNDI 名不匹配、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 failure | MySQL 主機/端口錯誤、防火牆阻攔、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 或升級驅動/數據庫 |
<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 規範,利於移植與運維分離。