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

Tomcat DBCP 資料源配置完整指南:單一與多資料源實戰

     編輯:Java 相關知識

前言

Tomcat 內建 DBCP (Database Connection Pool) 提供高效能資料庫連線池管理。本文以 Tomcat 5.0 + Informix 為例,詳細說明單一與多 JNDI 資料源配置步驟、web.xml 宣告、驅動程式部署與 Java 程式碼存取方式。

環境準備

  • Tomcat 5.0+ (含 6, 7, 8, 9)
  • 資料庫 JDBC 驅動 (範例使用 Informix com.informix.jdbc.IfxDriver)
  • 將驅動 JAR 放入 $CATALINA_HOME/lib (Tomcat 6+) 或 $CATALINA_HOME/common/lib (Tomcat 5)

一、單一資料源配置

1. server.xml 配置 (在 <Host> 內)

<DefaultContext>
    <Resource name="jdbc/testdb0_cs" auth="Container" type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/testdb0_cs">
        <parameter>
            <name>factory</name>
            <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
        </parameter>
        <parameter>
            <name>driverClassName</name>
            <value>com.informix.jdbc.IfxDriver</value>
        </parameter>
        <parameter>
            <name>url</name>
            <value>jdbc:informix-sqli://192.177.191.130:6666/testdb0_cs:INFORMIXSERVER=ccbhr_test</value>
        </parameter>
        <parameter><name>username</name><value>hrmis</value></parameter>
        <parameter><name>password</name><value>hrmis</value></parameter>
        <parameter><name>maxActive</name><value>20</value></parameter>
        <parameter><name>maxIdle</name><value>10</value></parameter>
        <parameter><name>poolPrepareStatements</name><value>true</value></parameter>
        <parameter><name>removeAbandoned</name><value>true</value></parameter>
        <parameter><name>removeAbandonedTimeout</name><value>60</value></parameter>
        <parameter><name>logAbandoned</name><value>false</value></parameter>
    </ResourceParams>
</DefaultContext>

2. web.xml 宣告資源參考

<resource-ref>
    <description>連線測試資料庫</description>
    <res-ref-name>jdbc/testdb0_cs</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

3. 重啟 Tomcat

二、多資料源配置

1. server.xml 新增多個 Resource 區塊

<DefaultContext>
    <!-- 第一個資料源 -->
    <Resource name="jdbc/testdb0_cs1" auth="Container" type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/testdb0_cs1">
        <parameter><name>factory</name><value>org.apache.commons.dbcp.BasicDataSourceFactory</value></parameter>
        <parameter><name>driverClassName</name><value>com.informix.jdbc.IfxDriver</value></parameter>
        <parameter><name>url</name><value>jdbc:informix-sqli://192.177.179.208:6666/testdb0_cs1:INFORMIXSERVER=ccbhr_test</value></parameter>
        <parameter><name>username</name><value>informix</value></parameter>
        <parameter><name>password</name><value>google</value></parameter>
        <!-- 連線池參數同單一資料源 -->
    </ResourceParams>

    <!-- 第二個資料源 -->
    <Resource name="jdbc/testdb0_cs" auth="Container" type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/testdb0_cs">
        <parameter><name>factory</name><value>org.apache.commons.dbcp.BasicDataSourceFactory</value></parameter>
        <parameter><name>driverClassName</name><value>com.informix.jdbc.IfxDriver</value></parameter>
        <parameter><name>url</name><value>jdbc:informix-sqli://192.177.191.130:6666/testdb0_cs:INFORMIXSERVER=ccbhr_test</value></parameter>
        <parameter><name>username</name><value>informix</value></parameter>
        <parameter><name>password</name><value>informix</value></parameter>
        <!-- 連線池參數同單一資料源 -->
    </ResourceParams>
</DefaultContext>

2. web.xml 宣告所有資源參考

<resource-ref>
    <description>資料庫 1</description>
    <res-ref-name>jdbc/testdb0_cs</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <description>資料庫 2</description>
    <res-ref-name>jdbc/testdb0_cs1</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

三、關鍵連線池參數詳解

參數說明建議值
maxActive最大活躍連線數 (0=無限制)20-100 視負載
maxIdle最大閒置連線數maxActive 的 30-50%
maxWait取得連線最長等待毫秒數 (-1=無限等待)10000 (10秒)
removeAbandoned是否回收被遺棄連線true
removeAbandonedTimeout判定遺棄的閒置秒數60-300
logAbandoned記錄遺棄連線堆疊追蹤開發 true / 生產 false
poolPrepareStatements緩存 PreparedStatementtrue (提升效能)
validationQuery連線驗證 SQL (如 SELECT 1)視資料庫而定
testOnBorrow借用時驗證true
testWhileIdle閒置驗證true

四、Java 程式碼存取資料源

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;

public class DataSourceUtil {
    public static Connection getConnection(String dsnName) {
        try {
            String jndiName = "java:comp/env/jdbc/" + dsnName.trim();
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup(jndiName);
            return ds.getConnection();
        } catch (Exception e) {
            throw new RuntimeException("取得資料源 [" + dsnName + "] 失敗: " + e.getMessage(), e);
        }
    }
}

// 使用範例
Connection conn1 = DataSourceUtil.getConnection("testdb0_cs");
Connection conn2 = DataSourceUtil.getConnection("testdb0_cs1");

五、Tomcat 7/8/9 現代化配置 (context.xml)

新版 Tomcat 建議使用 META-INF/context.xml 或 $CATALINA_HOME/conf/context.xml:

<Context>
    <Resource name="jdbc/myapp" 
              auth="Container"
              type="javax.sql.DataSource"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
              driverClassName="com.mysql.cj.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/myapp?useSSL=false&serverTimezone=UTC"
              username="root"
              password="secret"
              maxActive="50"
              maxIdle="20"
              minIdle="5"
              maxWait="10000"
              removeAbandonedTimeout="60"
              removeAbandoned="true"
              logAbandoned="false"
              testOnBorrow="true"
              validationQuery="SELECT 1"
              testWhileIdle="true"
              timeBetweenEvictionRunsMillis="30000"/>
</Context>

注意:Tomcat 7+ 預設使用 org.apache.tomcat.jdbc.pool.DataSourceFactory (Tomcat JDBC Pool),效能優於舊版 Commons DBCP。

六、常見問題排查

  • ClassNotFoundException:驅動 JAR 未放入 $CATALINA_HOME/lib
  • NameNotFoundException:JNDI 名稱錯誤,確認 java:comp/env/jdbc/ 前綴與 resource-ref 名稱一致
  • 連線洩漏:啟用 removeAbandoned=true 並檢查代碼確保 finally 區塊關閉連線
  • Informix 連線斷開:URL 加入 autoReconnect=true 或配置 validationQuery 定期驗證
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved