資料庫連線池是Java企業級應用的標配組件,能大幅降低建立連線的開銷、控制並發連線數、防止資料庫過載。本文梳理使用場景、主流連線池對比、以及Spring Boot實戰配置要點。
不需要:一次性腳本、單元測試(可用內存資料庫H2)、極低頻率的CLI工具。
| 連線池 | 特點 | 推薦指數 | 適用場景 |
|---|---|---|---|
| HikariCP | 極致效能、零額外依賴、預設配置即生產就緒、Spring Boot 2.x+預設 | ⭐⭐⭐⭐⭐ | 幾乎所有新專案首選 |
| Druid | 阿里開源、監控強大(SQL統計、防火牆、日誌)、支援Oracle/PostgreSQL/MySQL擴充 | ⭐⭐⭐⭐ | 需詳細SQL監控、中國團隊慣用 |
| Apache DBCP2 | 老牌、穩定、功能完整、效能略遜HikariCP | ⭐⭐⭐ | 舊專案維護、Tomcat預設 |
| c3p0 | 老牌、Hibernate歷史夥伴、效能最弱、近年更新極慢 | ⭐⭐ | 僅維護舊Hibernate專案 |
| Vibur DBCP | 新興、JMX監控完善、效能接近HikariCP | ⭐⭐⭐ | 需JMX深度監控的新專案 |
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Taipei&allowPublicKeyRetrieval=true
username: app_user
password: ${DB_PASSWORD}
hikari:
maximum-pool-size: 20 # 最大連線數 = CPU核心數 * 2 + 有效磁碟數(經驗公式)
minimum-idle: 5 # 最小閒置連線
idle-timeout: 300000 # 閒置5分鐘回收 (ms)
max-lifetime: 1800000 # 連線最大存活30分鐘 (ms)
connection-timeout: 30000 # 取得連線超時30秒 (ms)
validation-timeout: 5000 # 驗證連線超時5秒
leak-detection-threshold: 60000 # 洩漏偵測60秒 (0=關閉)
pool-name: MyApp-HikariCP # 方便JMX/日誌識別
# 自訂連線測試查詢(MySQL 8.0+建議)
connection-test-query: "SELECT 1"
# 資料來源屬性傳遞給JDBC驅動
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
hikaricp_connections_active:活躍連線數(持續逼近max → 擴容或優化慢查詢)hikaricp_connections_idle:閒置連線數hikaricp_connections_pending:等待連線的執行緒數(>0 表示瓶頸)hikaricp_connections_creation_ms / usage_ms:建立/使用連線耗時分佈max_connections或OS檔案描述符限制,反而拖垮DB。cachePrepStmts=true可大幅降低解析開銷。finally或try-with-resources歸還連線 → 開啟leak-detection-threshold。選對連線池、調優核心參數、建立監控告警,是Java後端穩定運行的基石。