common/ 目錄,改為 lib/ 目錄統一放置共用庫。mysql-connector-java-x.x.x.jar 必須放入 $CATALINA_HOME/lib/。context.xml(全域)或 META-INF/context.xml(應用級)。mysql-connector-java-5.1.x.jar(或 8.0.x 對應 MySQL 8.0)apache-tomcat-6.0.x.exe
copy mysql-connector-java-5.1.48.jar %CATALINA_HOME%\lib\
-- 或 Linux
cp mysql-connector-java-5.1.48.jar $CATALINA_HOME/lib/
重啟 Tomcat 生效。
編輯 $CATALINA_HOME/conf/context.xml,在 <Context> 內新增:
關鍵參數說明:
maxActive:最大活躍連線數(建議 ≤ MySQL max_connections - 保留管理連線)。maxIdle:最大閒置連線數。maxWait:取得連線最長等待毫秒數。validationQuery / testOnBorrow:借用連線前驗證有效性,防止「斷連」錯誤。testWhileIdle / timeBetweenEvictionRunsMillis:空閒連線驅逐機制。編輯應用 WEB-INF/web.xml:
DB Connection
jdbc/MySQL
javax.sql.DataSource
Container
注意:res-ref-name 必須與 context.xml 的 name 屬性一致(jdbc/MySQL)。
<%@ page import="java.sql.*, javax.sql.*, javax.naming.*" %>
<%
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 * FROM users");
while (rs.next()) {
out.println(rs.getString(1) + "
");
}
} finally {
conn.close(); // 歸還連線池,關鍵!
}
%>
| 現象 | 原因 | 解決 |
|---|---|---|
| NameNotFoundException: jdbc/MySQL | JNDI 名稱不匹配、web.xml 缺少 resource-ref | 核對 context.xml name、web.xml res-ref-name、lookup 路徑 |
| ClassNotFoundException: com.mysql.jdbc.Driver | 驅動 jar 未放入 $CATALINA_HOME/lib | 複製 jar 到 lib 目錄、重啟 Tomcat |
| Communications link failure | MySQL 服務未啟動、IP/Port 錯誤、防火牆 | 檢查 MySQL 狀態、url 參數、防火牆 3306 |
| 連線洩漏、池耗盡 | 程式碼未在 finally 關閉連線 | 強制使用 try-with-resources / finally conn.close() |
| 驗證查詢失效 | MySQL 8.0+ 驅動類別為 com.mysql.cj.jdbc.Driver | 更新 driverClassName、validationQuery="SELECT 1" |
-- Tomcat 9/10 (Servlet 4.0/5.0)
driverClassName="com.mysql.cj.jdbc.Driver" -- MySQL 8.0+ 驅動
url="jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC"