本文專針對 Tomcat 5.5 + MySQL Connector/J + Commons DBCP 組合。新版 Tomcat (7/8/9) 架構不同,不適用。
資料源已在 server.xml 或 context.xml 宣告,但未建立 ResourceLink 將其綁定至 Web 應用命名空間,導致 driverClassName、url 等屬性對應用不可見。
$CATALINA_BASE/conf/context.xml 加入 <ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/>server.xml 對應 <Context> 內緊貼 <Context> 後加入相同 ResourceLinkTomcat 5.5 內建 DBCP 版本要求 factory 為 org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory,舊版 org.apache.commons.dbcp.BasicDataSourceFactory 失效。且 <Context> 內宣告資料源在 5.5 中不生效。
統一宣告於 <GlobalNamingResources> 區塊,再由 ResourceLink 連結:
<GlobalNamingResources>
<Resource name="jdbc/test"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?autoReconnect=true"
username="root" password="admin"
maxActive="4" maxIdle="2" maxWait="5000"/>
</GlobalNamingResources>
MySQL Connector/J JAR 未放入 Tomcat 共用類別路徑。
mysql-connector-java-x.x.xx.jar 複製至 $CATALINA_HOME/common/lib/(5.5)或 $CATALINA_HOME/lib/(6.0+)。
程式碼未正確關閉 ResultSet、Statement、Connection,連線洩漏導致池耗盡。
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
// 處理結果
} finally {
if (rs != null) try { rs.close(); } catch (SQLException e) { log.error(e); }
if (ps != null) try { ps.close(); } catch (SQLException e) { log.error(e); }
if (conn != null) try { conn.close(); } catch (SQLException e) { log.error(e); }
}
建議:使用 Try-with-resources (Java 7+) 或 Spring JdbcTemplate 自動管理資源。
server.xml </GlobalNamingResources> 前加入 Resource 定義context.xml 加入 ResourceLinkmysql-connector-java.jar → common/lib/Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/test"); // 這裡用「映射後名稱」即 ResourceLink 的 name
| 參數 | 建議值 | 說明 |
|---|---|---|
| maxActive | 20-50 | 視應用併發與 DB max_connections 而定 |
| maxIdle | 5-10 | 保持熱連線減少建立開銷 |
| maxWait | 10000 | 毫秒,避免無限等待 |
| validationQuery | SELECT 1 | 驗證連線有效性,防火牆斷開長連線 |
| testOnBorrow | true | 借用時驗證 |
遵循「全域宣告 + ResourceLink + 驅動共用 + 嚴格關閉資源」四原則,徹底解決 Tomcat 5.5 MySQL 連線池疑難雜症。