依賴坐標 (Maven)
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- Oracle 需額外引入 ojdbc8.jar -->
MySQL 數據源 Bean
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://192.168.0.1/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true"/>
<property name="user" value="username"/>
<property name="password" value="password"/>
<property name="minPoolSize" value="10"/>
<property name="maxPoolSize" value="20"/>
<property name="initialPoolSize" value="10"/>
<!-- 關鍵連接池調優參數 -->
<property name="acquireIncrement" value="5"/>
<property name="maxIdleTime" value="1800"/> <!-- 30 分鐘空閒回收 -->
<property name="maxConnectionAge" value="7200"/> <!-- 2 小時強制換新 -->
<property name="checkoutTimeout" value="30000"/> <!-- 30 秒獲取超時 -->
<property name="testConnectionOnCheckin" value="true"/>
<property name="idleConnectionTestPeriod" value="300"/> <!-- 5 分鐘檢測空閒 -->
<property name="preferredTestQuery" value="SELECT 1"/>
</bean>
Oracle 數據源 Bean
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="oracle.jdbc.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.0.1:1521:orcl"/>
<property name="user" value="username"/>
<property name="password" value="password"/>
<property name="minPoolSize" value="10"/>
<property name="maxPoolSize" value="20"/>
<property name="initialPoolSize" value="10"/>
<property name="acquireIncrement" value="5"/>
<property name="maxIdleTime" value="1800"/>
<property name="maxConnectionAge" value="7200"/>
<property name="checkoutTimeout" value="30000"/>
<property name="testConnectionOnCheckin" value="true"/>
<property name="idleConnectionTestPeriod" value="300"/>
<property name="preferredTestQuery" value="SELECT 1 FROM DUAL"/>
</bean>
Hibernate SessionFactory 整合
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<!-- Oracle: org.hibernate.dialect.Oracle12cDialect -->
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
</props>
</property>
<property name="packagesToScan" value="com.example.entity"/>
</bean>
核心參數調優建議
| 參數 | 建議值 | 說明 |
| minPoolSize | 核心業務並發基線 | 啟動預熱,避免冷啟動延遲 |
| maxPoolSize | maxPoolSize = (核心數 * 2) + 有效盤轉數 | 參考 HikariCP 公式,避免過大拖垮資料庫 |
| idleConnectionTestPeriod | 300 秒 | 防止防火牆/資料庫斷開空閒連線 |
| preferredTestQuery | SELECT 1 / SELECT 1 FROM DUAL | 極輕量驗證查詢,MySQL/Oracle 通用 |
| checkoutTimeout | 30000 ms | 避免業務線程無限等待,快速失敗觸發熔斷 |
避坑指南
- Driver 類名: MySQL 8.0+ 用
com.mysql.cj.jdbc.Driver(舊版 com.mysql.jdbc.Driver 已棄用)。
- 時區參數:
serverTimezone=Asia/Shanghai 解決時區偏移。
- SSL 關閉: 內網環境
useSSL=false 減少握手開銷。
- autoReconnect=true: 僅作最後防線,**不建議依賴**,應用層需實現重試邏輯。
- JAR 衝突: 類路徑中僅保留一版 c3p0、一版 JDBC 驅動,避免
NoSuchMethodError。