資料庫連線是昂貴且稀缺的資源,連線池透過預建立、複用、管理連線,顯著提升系統吞吐量與穩定性。本文剖析連線池工作原理,並以 Apache Commons DBCP 為例展示 Struts 1 時代的經典整合配置。

BasicDataSource:最常用的 DataSource 實現,內部依賴 commons-pool 物件池driverClassName、url、username、password:資料庫連線四要素initialSize:初始連線數maxActive (maxTotal):最大連線數maxIdle/minIdle:空閒連線上下限maxWait:獲取連線最長等待時間 (ms)validationQuery:連線驗證 SQL (如 SELECT 1)testOnBorrow/testWhileIdle:借用/空閒時驗證在 struts-config.xml 中宣告 <data-sources>:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"https://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<!-- 配置資料源 -->
<data-sources>
<data-source type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
<set-property property="url" value="jdbc:mysql://localhost:3306/demo" />
<set-property property="username" value="root" />
<set-property property="password" value="" />
<set-property property="maxActive" value="10" />
<set-property property="maxWait" value="5000" />
<set-property property="defaultAutoCommit" value="false" />
<set-property property="defaultReadOnly" value="false" />
<set-property property="validationQuery" value="SELECT COUNT(*) FROM user" />
</data-source>
</data-sources>
</struts-config>
public class UserAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DataSource ds = getDataSource(request); // Struts 1 基類提供
Connection conn = null;
try {
conn = ds.getConnection();
// 業務邏輯...
} catch (SQLException e) {
// 異常處理
} finally {
if (conn != null) try { conn.close(); } catch (SQLException ignore) {}
}
return mapping.findForward("success");
}
}
| 特性 | DBCP 1.x | C3P0 | HikariCP (推薦) | Druid (推薦) |
|---|---|---|---|---|
| 效能 | 中等 | 中等 | 極高 (無鎖設計) | 高 |
| 監控功能 | 弱 | 基本 | 強 (Metrics 整合) | 極強 (內建監控) |
| SQL 防注入 | 無 | 無 | 無 | 內建 WallFilter |
| 維護狀態 | 低頻更新 | 低頻更新 | 活躍 | 活躍 |
遷移建議:新專案優先選用 HikariCP (Spring Boot 2.x 預設) 或 Druid (國產強監控),舊專案維護可續用 DBCP/C3P0 但需注意已知 Bug (如 DBCP 1.x 在高併發下可能耗盡連線)。