首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Tomcat 資料庫連線池完整設定指南:JNDI DataSource 實戰

     編輯:Java 相關知識

架構概覽

Tomcat 內建 DBCP 連線池,透過 JNDI 註冊 javax.sql.DataSource,應用程式查找使用,實現連線共享與生命週期管理。

四步驟設定流程

1. 放置 JDBC 驅動

將資料庫驅動 JAR (如 mysql-connector-java.jar) 放入 $CATALINA_HOME/common/lib/ (Tomcat 5.x) 或 $CATALINA_HOME/lib/ (Tomcat 6+)。

2. server.xml 定義全域資料源

<GlobalNamingResources>
  <Resource name="jdbc/DBPool"
            type="javax.sql.DataSource"
            password="root"
            driverClassName="com.mysql.jdbc.Driver"
            maxIdle="2"
            maxWait="5000"
            username="root"
            url="jdbc:mysql://127.0.0.1:3306/test"
            maxActive="4" />
</GlobalNamingResources>
屬性說明
nameJNDI 名稱,慣用 jdbc/xxx 格式
type固定 javax.sql.DataSource
maxActive最大連線數 (0=無限制)
maxIdle最大閒置連線數
maxWait取得連線最長等待毫秒 (-1=無限制)
driverClassNameJDBC 驅動完整類名
url/username/password資料庫連線參數

3. web.xml 宣告資源參考

<resource-ref>
  <description>MySQL DB Connection Pool</description>
  <res-ref-name>jdbc/DBPool</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

4. context.xml 連結全域資料源

<Context>
  <ResourceLink name="jdbc/DBPool"
                type="javax.sql.DataSource"
                global="jdbc/DBPool" />
</Context>

放置於 $CATALINA_HOME/conf/context.xml (全域) 或專案 META-INF/context.xml (專案專用)。

Java 程式碼取得連線

連線池工具類

import javax.naming.*;
import javax.sql.DataSource;

public class DBPool {
    private static DataSource pool;

    static {
        try {
            Context env = (Context) new InitialContext().lookup("java:comp/env");
            pool = (DataSource) env.lookup("jdbc/DBPool");
            if (pool == null) System.err.println("'DBPool' is an unknown DataSource");
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    public static DataSource getPool() { return pool; }
}

使用範例

// 在 Servlet、DAO 或 JSP 中
try (Connection conn = DBPool.getPool().getConnection();
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id=?")) {
    ps.setInt(1, userId);
    try (ResultSet rs = ps.executeQuery()) {
        // 處理結果
    }
} // 自動歸還連線至連線池 (非關閉物理連線)

關鍵注意事項

  • 必須呼叫 conn.close(): 歸還連線給連線池,而非關閉物理連線
  • 拋棄連線檢測: 可加入 validationQuery="SELECT 1"、testOnBorrow="true" 防止斷線
  • 生產環境調大參數: maxActive 依峰值 QPS 與資料庫最大連線數設定
  • 避免在類載入時查找: 延遲至首次使用 (如上例 static 區塊) 避免啟動順序問題
  • Tomcat 7+ 遷移: common/lib → lib,factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 使用新版連線池

驗證設定是否生效

  1. 啟動 Tomcat,查看 catalina.out 無 NamingException
  2. 管理介面 /manager/html → "JNDI Resources" 確認 jdbc/DBPool 存在
  3. 撰寫測試 JSP/Servlet 呼叫 DBPool.getPool().getConnection() 驗證

本設定適用 Tomcat 5.x/6.x/7.x/8.x/9.x,細節參數請參考對應版本官方文件。

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