tomcat-users.xml 配置 manager-gui、admin-gui 角色)SUBRDB、用戶 root/密碼mysql-connector-java-3.1.x-bin.jar (或更新版),放置於 $CATALINA_HOME/common/lib (全局共享) 與 $WEBAPP/WEB-INF/lib (應用隔雙保險)https://localhost:8080/admin/,登錄管理員賬號jdbc/MySQL (建議 jdbc/ 前綴,規範命名)jdbc:mysql://192.168.0.16:3306/SUBRDB?useUnicode=true&characterEncoding=UTF-8com.mysql.jdbc.Driver (5.1+ 版本)20 (最大活躍連接,根據壓測調整)10 (最大空閒保持)5000 (毫秒,獲取連接超時)SELECT 1 (MySQL 專用,驗證連接有效性)$CATALINA_HOME/conf/Catalina/localhost/ROOT.xml (或對應 Context 文件)$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>
$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>
$CATALINA_HOME/conf/Catalina/localhost/你的應用.xml<Context ...>
<ResourceLink name="jdbc/MySQL" global="jdbc/MySQL" type="javax.sql.DataSource"/>
</Context>
<%@ 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/MySQL | JNDI 名稱不匹配、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 |
Tomak 5 已停止維護。現代項目建議:
spring.datasource.hikari.* 配置,無需容器級 JNDI