生產環境絕不手寫連接池。本文詳細演示 Apache DBCP、C3P0、Tomcat 內置池三大主流開源實現的Maven 依賴、核心配置、代碼使用、性能特點,並給出基於場景的選型建議,助你快速落地生產級數據庫訪問層。
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java
username=root
password=root
initialSize=5
maxActive=20
maxIdle=10
minIdle=5
maxWait=3000
Properties props = new Properties();
props.load(new FileReader("dbcp.properties"));
DataSource ds = BasicDataSourceFactory.createDataSource(props);
Connection conn = ds.getConnection();
// ... 業務操作
conn.close(); // 歸還池
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/java</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
<property name="minPoolSize">5</property>
<property name="acquireIncrement">3</property>
<property name="maxIdleTime">300</property>
</default-config>
<!-- 命名配置,代碼 new ComboPooledDataSource("namedConfig") -->
<named-config name="oracleConfig"> ... </named-config>
</c3p0-config>
// 默認配置
ComboPooledDataSource ds = new ComboPooledDataSource();
// 或指定命名配置
// ComboPooledDataSource ds = new ComboPooledDataSource("oracleConfig");
Connection conn = ds.getConnection();
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>8.5.x</version>
</dependency>
org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/java");
ds.setUsername("root");
ds.setPassword("root");
ds.setInitialSize(5);
ds.setMaxActive(20);
ds.setMaxIdle(10);
ds.setMinIdle(5);
ds.setMaxWait(3000);
// 核心優勢:攔截器鏈支援
ds.setJdbcInterceptors(
"ConnectionState;StatementCache(max=50);SlowQueryReport(threshold=1000)"
);
Connection conn = ds.getConnection();
| 維度 | DBCP 1.x/2.x | C3P0 | Tomcat JDBC Pool |
|---|---|---|---|
| 線程安全 | 單鎖,高併發瓶頸 | 多鎖細粒度,較好 | 無鎖/細粒度鎖,最優 |
| 性能 | 一般 | 中等 | 優秀(接近 HikariCP) |
| 功能豐富度 | 基礎 | 豐富(預備語句緩存、自動測試) | 極豐富(攔截器、JMX、公平排隊) |
| 配置方式 | Properties 文件 | XML 文件 | 代碼/屬性/Bean 多樣 |
| 維護狀態 | DBCP2 維護中 | 更新緩慢 | Tomcat 核心組件,活躍 |
| Spring Boot 默認 | 否 | 否 | 否 (默認 HikariCP) |
org.apache.tomcat.jdbc.pool.DataSource,零額外依賴,功能強大。maxActive/maxPoolSize = (CPU 核心數 × 2) + 有效磁盤數(經驗值),或壓測確定minIdle ≈ maxActive 避免動態伸縮抖動testOnBorrow + validationQuery="SELECT 1" 防止死連接removeAbandoned=true 防止連接泄漏
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/java?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maximumPoolSize" value="20"/>
<property name="minimumIdle" value="10"/>
<property name="connectionTimeout" value="30000"/>
<property name="idleTimeout" value="600000"/>
<property name="maxLifetime" value="1800000"/>
<property name="connectionTestQuery" value="SELECT 1"/>
</bean>
連接池是應用與數據庫之間的「緩衝器」,選對池、配好參數、監控指標(活躍連接數、等待時間、泄漏檢測),才能讓數據庫訪問層穩如磐石。建議新項目直接上 HikariCP + Spring Boot 自動配置,老項目遷移成本極低,收益顯著。