首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 數據源配置全攻略:DBCP、C3P0、JNDI 與最佳實踐

     編輯:Java 相關知識

概覽

Spring 提供多種數據源配置方式,滿足從開發測試到生產部署的不同需求。本文系統梳理內置實現、第三方連接池、JNDI 查找及屬性文件外部化配置。

一、第三方連接池配置

1. Apache DBCP (Database Connection Pool)

依賴: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>

2. C3P0 連接池

依賴: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>

二、屬性文件外部化配置

將敏感信息與環境差異隔離:

1. 定義 jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sampledb
jdbc.username=root
jdbc.password=1234

2. Spring 配置引用

<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 " 導致認證失敗。

三、JNDI 數據源查找(生產環境推薦)

1. 傳統方式

<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>

2. Spring 2.0+ jee 命名空間(推薦)

<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>

四、Spring 內置簡易實現(僅適合測試)

<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 (默認)性能最優、配置極簡、字節碼級優化

七、最佳實踐清單

  1. 必須設置 destroy-method="close" 確保容器關閉時正確釋放連接池資源
  2. 生產環境強制使用連接驗證:validationQuery + testOnBorrow/idleConnectionTestPeriod
  3. 密碼加密存儲:結合 Jasypt 或 Spring Cloud Config 加密 jdbc.password
  4. 監控指標暴露:啟用 logAbandoned、配置 Actuator /metrics/datasource.*
  5. 分環境配置:dev/test/prod 分離 jdbc.properties,構建時注入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved