Spring 提供多種數據源配置方式,滿足從開發測試到生產部署的不同需求。本文系統梳理內置實現、第三方連接池、JNDI 查找及屬性文件外部化配置。
依賴:commons-dbcp.jar + commons-pool.jar
<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:3306/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="5000" /> <!-- 獲取連接超時(ms) -->
<property name="defaultAutoCommit" value="true" /> <!-- 默認自動提交 -->
<property name="validationQuery" value="SELECT 1" /> <!-- 連接驗證查詢 -->
<property name="testOnBorrow" value="true" /> <!-- 借用時驗證 -->
<property name="removeAbandoned" value="true" /> <!-- 回收棄用連接 -->
<property name="removeAbandonedTimeout" value="300" />
<property name="logAbandoned" value="true" /> <!-- 記錄棄用連接 -->
</bean>
依賴:c3p0-0.9.5.x.jar (含 mchange-commons-java.jar)
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="user" value="admin" />
<property name="password" value="1234" />
<!-- 核心池參數 -->
<property name="initialPoolSize" value="5" /> <!-- 初始連接數 -->
<property name="minPoolSize" value="5" /> <!-- 最小連接數 -->
<property name="maxPoolSize" value="20" /> <!-- 最大連接數 -->
<property name="acquireIncrement" value="3" /> <!-- 擴容增量 -->
<!-- 連接驗證 -->
<property name="preferredTestQuery" value="SELECT 1 FROM DUAL" />
<property name="idleConnectionTestPeriod" value="300" /> <!-- 閒置檢查間隔(秒) -->
<property name="testConnectionOnCheckin" value="true" />
<!-- 語句緩存 -->
<property name="maxStatements" value="100" /> <!-- 全局緩存 -->
<property name="maxStatementsPerConnection" value="20" /> <!-- 每連接緩存 -->
<!-- 異步執行緒 -->
<property name="numHelperThreads" value="3" />
</bean>
將敏感信息與環境差異隔離:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sampledb
jdbc.username=root
jdbc.password=1234
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/jdbc.properties" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
注意:${jdbc.username} 前後不能有空格,否則會解析為 " root " 導致認證失敗。
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/myDataSource" />
<property name="resourceRef" value="true" /> <!-- 自動添加 java:comp/env/ 前綴 -->
</bean>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:jee="https://www.springframework.org/schema/jee"
xsi:schemaLocation="...
https://www.springframework.org/schema/jee https://www.springframework.org/schema/jee/spring-jee.xsd">
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myDataSource"
resource-ref="true" proxy-interface="javax.sql.DataSource" />
</beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/sampledb" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
缺點:無連接池,每次 getConnection() 創建新連接,性能差,嚴禁生產使用。
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/sampledb");
ds.setUsername("root");
ds.setPassword("1234");
Connection conn = ds.getConnection(); // 無依賴容器
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 開發/單元測試 | DriverManagerDataSource / 代碼式 | 零依賴、啟動快、無池化開銷 |
| 中小型生產應用 | DBCP / C3P0 (Spring 管理) | 配置簡單、功能足夠、Spring 生命周期集成 |
| 高併發/企業級應用 | 應用服務器 JNDI (WebLogic/WebSphere) | 統一資源管理、監控運維友好、支持分佈式事務 |
| Spring Boot 2.x+ | HikariCP (默認) | 性能最優、配置極簡、字節碼級優化 |
validationQuery + testOnBorrow/idleConnectionTestPeriodjdbc.passwordlogAbandoned、配置 Actuator /metrics/datasource.*