Hibernate 內建連接池僅供開發測試使用,生產環境存在嚴重效能瓶頸與已知 Bug(如 MySQL 8 小時空閒連接斷開問題)。官方推薦整合成熟的第三方連接池:C3P0、Proxool、DBCP(Hibernate 3 不再推薦直接使用,建議透過 JNDI)。
net.sf.hibernate.connection.*,Hibernate 3 統一為 org.hibernate.connection.*(如 C3P0ConnectionProvider)。<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"https://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/schoolproject</property>
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/wqbi/model/pojo/student.hbm.xml" />
</session-factory>
</hibernate-configuration>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property> <!-- 秒,空閒連接回收 -->
<property name="hibernate.c3p0.max_statements">100</property> <!-- Statement 緩存 -->
<property name="hibernate.c3p0.idle_test_period">120</property> <!-- 秒,檢測頻率 -->
<property name="hibernate.c3p0.acquire_increment">2</property> <!-- 每次擴容數量 -->
關鍵參數解析:
max_size:池最大連接數,依資料庫最大連接數與應用並發度設定。idle_test_period:需 小於資料庫 wait_timeout(MySQL 預設 8 小時),建議 30-60 秒,配合 preferredTestQuery(如 SELECT 1)主動心跳,防斷連。max_statements:啟用 PreparedStatement 緩存,提升重複查詢效能。需兩個檔案:proxool.xml(池配置)與 hibernate.cfg.xml(引用)。
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
<proxool>
<alias>DBPool</alias>
<driver-url>jdbc:mysql://localhost:3306/schoolproject?useUnicode=true&characterEncoding=UTF8</driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="root"/>
<property name="password" value=""/>
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time> <!-- 90秒檢測 -->
<maximum-new-connections>20</maximum-new-connections> <!-- 等待隊列上限 -->
<prototype-count>5</prototype-count> <!-- 最小空閒 -->
<maximum-connection-count>100</maximum-connection-count> <!-- 最大連接 -->
<minimum-connection-count>10</minimum-connection-count> <!-- 最小連接 -->
</proxool>
</something-else-entirely>
<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
<property name="hibernate.proxool.pool_alias">DBPool</property> <!-- 對應 proxool.xml alias -->
<property name="hibernate.proxool.xml">proxool.xml</property> <!-- 相對/絕對路徑 -->
| 維度 | C3P0 | Proxool | HikariCP (現代首選) |
|---|---|---|---|
| 效能 | 良好 | 良好 | 極佳(無鎖設計) |
| 監控指標 | 基礎 JMX | 豐富(Servlet、JMX、Log4j) | 完整 Metrics |
| 維護狀態 | 低頻更新 | 已停止維護 | 活躍維護中 |
| 適用場景 | 傳統 Hibernate 專案 | 需詳細監控的舊系統 | 新專案、Spring Boot 預設 |
遷移提示:新專案強烈建議直接使用 HikariCP(Spring Boot 2.x+ 預設),配置僅需
spring.datasource.hikari.*前綴屬性,效能與穩定性遠超上述三者。
idle_test_period < wait_timeout 並啟用 preferredTestQuery。max_statements 過大導致 OOM:根據 SQL 種類數量設定,通常 100-500 足矣。alias 大小寫敏感,hibernate.cfg.xml 與 proxool.xml 必須完全一致。hibernate-c3p0 模組(舊版需引入)。