Tomcat 內建 DBCP 連線池,透過 JNDI 註冊 javax.sql.DataSource,應用程式查找使用,實現連線共享與生命週期管理。
將資料庫驅動 JAR (如 mysql-connector-java.jar) 放入 $CATALINA_HOME/common/lib/ (Tomcat 5.x) 或 $CATALINA_HOME/lib/ (Tomcat 6+)。
<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>
| 屬性 | 說明 |
|---|---|
| name | JNDI 名稱,慣用 jdbc/xxx 格式 |
| type | 固定 javax.sql.DataSource |
| maxActive | 最大連線數 (0=無限制) |
| maxIdle | 最大閒置連線數 |
| maxWait | 取得連線最長等待毫秒 (-1=無限制) |
| driverClassName | JDBC 驅動完整類名 |
| url/username/password | 資料庫連線參數 |
<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>
<Context>
<ResourceLink name="jdbc/DBPool"
type="javax.sql.DataSource"
global="jdbc/DBPool" />
</Context>
放置於 $CATALINA_HOME/conf/context.xml (全域) 或專案 META-INF/context.xml (專案專用)。
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 與資料庫最大連線數設定common/lib → lib,factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 使用新版連線池catalina.out 無 NamingException/manager/html → "JNDI Resources" 確認 jdbc/DBPool 存在DBPool.getPool().getConnection() 驗證本設定適用 Tomcat 5.x/6.x/7.x/8.x/9.x,細節參數請參考對應版本官方文件。