<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://192.168.3.110:3306/DBName?useUnicode=true&characterEncoding=GBK"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<!-- 連接池核心參數 -->
<property name="minPoolSize" value="5"/> <!-- 最小連接數 -->
<property name="maxPoolSize" value="30"/> <!-- 最大連接數 -->
<property name="initialPoolSize" value="10"/> <!-- 初始化連接數 -->
<property name="maxIdleTime" value="60"/> <!-- 最大空閒時間(秒),0 永不丟棄 -->
<property name="acquireIncrement" value="5"/> <!-- 連接耗盡時一次獲取數 -->
<!-- Statement 緩存 -->
<property name="maxStatements" value="0"/> <!-- 0 關閉緩存 -->
<!-- 連接驗證與重試 -->
<property name="idleConnectionTestPeriod" value="60"/> <!-- 每 60 秒檢查空閒連接 -->
<property name="acquireRetryAttempts" value="30"/> <!-- 獲取失敗重試次數 -->
<property name="breakAfterAcquireFailure" value="true"/> <!-- 失敗後標記斷開永久關閉 -->
<property name="testConnectionOnCheckout" value="false"/> <!-- 提交時驗證(性能差) -->
</bean>
| 屬性 | 說明 | 建議 |
|---|---|---|
| acquireIncrement | 連接不足時批量創建數 | 5-10,避免頻繁創建 |
| acquireRetryAttempts / acquireRetryDelay | 重試次數/間隔(ms) | 30 / 1000ms |
| idleConnectionTestPeriod | 空閒連接檢查周期(秒) | 60,平衡性能與可用性 |
| maxIdleTime | 連接最大空閒時間(秒) | 60-300,0 表永不過期 |
| maxStatements / maxStatementsPerConnection | PreparedStatement 緩存 | 單連接緩存較實用,總緩存慎用 |
| preferredTestQuery | 自定義驗證 SQL | 如 SELECT 1,加速驗證 |
| testConnectionOnCheckin / Checkout | 歸還/獲取時驗證 | 建議用 idleConnectionTestPeriod 替代 |
| numHelperThreads | 異步操作輔助線程數 | 默認 3,高併發可調大 |
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3309/sampledb"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
<!-- 常用屬性 -->
<property name="maxActive" value="20"/>
<property name="maxIdle" value="10"/>
<property name="maxWait" value="10000"/>
<property name="validationQuery" value="SELECT 1"/>
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="300"/>
</bean>
核心差異:C3P0 參數更豐富,支援 Statement 緩存、異步操作、更細緻的重試/驗證控制;DBCP 配置較簡單,依賴 commons-pool。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/jdbc.properties"/>
</bean>
<bean id="dataSource" ...>
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<!-- ... -->
</bean>
注意:${...} 前後勿留空格,否則空格會成為值一部分導致錯誤。
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/bbs"/>
</bean>
<beans xmlns:jee="https://www.springframework.org/schema/jee" ...>
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/bbs"/>
</beans>
非池化,每次 getConnection() 新建連接,適合單元測試或獨立應用:
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3309/sampledb");
ds.setUsername("root");
ds.setPassword("1234");
Connection conn = ds.getConnection();