首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Tomcat 5.5 + MySQL 連線池配置完整避坑指南:三大錯誤、解決方案與最佳實務

     編輯:MySQL 綜合教學

環境鎖定

本文專針對 Tomcat 5.5 + MySQL Connector/J + Commons DBCP 組合。新版 Tomcat (7/8/9) 架構不同,不適用。

錯誤一:Cannot create JDBC driver of class '' for connect URL 'null'

根因

資料源已在 server.xml 或 context.xml 宣告,但未建立 ResourceLink 將其綁定至 Web 應用命名空間,導致 driverClassName、url 等屬性對應用不可見。

解決

  1. 全域資料源(推薦):在 $CATALINA_BASE/conf/context.xml 加入 <ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/>
  2. 單一 Context:在 server.xml 對應 <Context> 內緊貼 <Context> 後加入相同 ResourceLink

錯誤二:javax.naming.NameNotFoundException: Name XXX is not bound in this Context

根因

Tomcat 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>

錯誤三:Cannot load JDBC driver class 'com.mysql.jdbc.Driver'

根因

MySQL Connector/J JAR 未放入 Tomcat 共用類別路徑。

解決

mysql-connector-java-x.x.xx.jar 複製至 $CATALINA_HOME/common/lib/(5.5)或 $CATALINA_HOME/lib/(6.0+)。

錯誤四:Cannot get a connection, pool exhausted

根因

程式碼未正確關閉 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 自動管理資源。

三步完成標準部署

  1. 宣告資料源:server.xml </GlobalNamingResources> 前加入 Resource 定義
  2. 建立連結:context.xml 加入 ResourceLink
  3. 放入驅動:mysql-connector-java.jar → common/lib/

JNDI 查找關鍵點

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/test");  // 這裡用「映射後名稱」即 ResourceLink 的 name

參數調優建議

參數建議值說明
maxActive20-50視應用併發與 DB max_connections 而定
maxIdle5-10保持熱連線減少建立開銷
maxWait10000毫秒,避免無限等待
validationQuerySELECT 1驗證連線有效性,防火牆斷開長連線
testOnBorrowtrue借用時驗證

遵循「全域宣告 + ResourceLink + 驅動共用 + 嚴格關閉資源」四原則,徹底解決 Tomcat 5.5 MySQL 連線池疑難雜症。

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