首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

c3p0 連接池配置實戰:Spring 整合 MySQL 與 Oracle 完整 Bean 定義

     編輯:MySQL 資料庫相關知識

依賴坐標 (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核心業務並發基線啟動預熱,避免冷啟動延遲
maxPoolSizemaxPoolSize = (核心數 * 2) + 有效盤轉數參考 HikariCP 公式,避免過大拖垮資料庫
idleConnectionTestPeriod300 秒防止防火牆/資料庫斷開空閒連線
preferredTestQuerySELECT 1 / SELECT 1 FROM DUAL極輕量驗證查詢,MySQL/Oracle 通用
checkoutTimeout30000 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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved