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

Spring 數據源配置詳解:C3P0 核心參數、DBCP 對比與 JNDI 整合

     編輯:Java 綜合教學

C3P0 數據源完整配置範例

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

C3P0 關鍵屬性深度解析

屬性說明建議
acquireIncrement連接不足時批量創建數5-10,避免頻繁創建
acquireRetryAttempts / acquireRetryDelay重試次數/間隔(ms)30 / 1000ms
idleConnectionTestPeriod空閒連接檢查周期(秒)60,平衡性能與可用性
maxIdleTime連接最大空閒時間(秒)60-300,0 表永不過期
maxStatements / maxStatementsPerConnectionPreparedStatement 緩存單連接緩存較實用,總緩存慎用
preferredTestQuery自定義驗證 SQL如 SELECT 1,加速驗證
testConnectionOnCheckin / Checkout歸還/獲取時驗證建議用 idleConnectionTestPeriod 替代
numHelperThreads異步操作輔助線程數默認 3,高併發可調大

DBCP 配置對比

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

注意:${...} 前後勿留空格,否則空格會成為值一部分導致錯誤。

JNDI 數據源整合

傳統方式

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/bbs"/>
</bean>

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

<beans xmlns:jee="https://www.springframework.org/schema/jee" ...>
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/bbs"/>
</beans>

Spring 內建簡易數據源:DriverManagerDataSource

非池化,每次 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();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved