Spring Boot HikariCP 連接池 YAML 配置最佳實(shí)踐
一、HikariCP YAML 配置詳解
HikariCP 是 Spring Boot 2.x 及更高版本的默認(rèn)數(shù)據(jù)庫(kù)連接池,以下是完整的 YAML 配置說(shuō)明和優(yōu)化建議。
基礎(chǔ)配置
spring:
datasource:
hikari:
# 連接池名稱 (用于監(jiān)控和日志)
pool-name: MyHikariPool
# 連接池中允許的最大連接數(shù) (默認(rèn): 10)
maximum-pool-size: 20
# 連接池中保持的最小空閑連接數(shù) (建議與maximum-pool-size相同)
minimum-idle: 20
# 連接超時(shí)時(shí)間 (毫秒) (默認(rèn): 30000)
connection-timeout: 30000
# 連接最大存活時(shí)間 (毫秒) (建議比數(shù)據(jù)庫(kù)wait_timeout小2-3分鐘)
max-lifetime: 1800000 # 30分鐘
# 連接空閑超時(shí)時(shí)間 (毫秒) (默認(rèn): 600000)
idle-timeout: 600000 # 10分鐘
# 連接測(cè)試查詢 (部分?jǐn)?shù)據(jù)庫(kù)需要)
connection-test-query: SELECT 1
# 自動(dòng)提交 (默認(rèn): true)
auto-commit: true高級(jí)配置
spring:
datasource:
hikari:
# 數(shù)據(jù)源類(lèi)名 (通常不需要指定)
data-source-class-name: com.zaxxer.hikari.HikariDataSource
# 連接初始化SQL (每次新建連接后執(zhí)行)
connection-init-sql: SET NAMES utf8mb4
# 是否隔離自動(dòng)提交事務(wù) (默認(rèn): false)
isolate-internal-queries: false
# 是否注冊(cè)JMX (默認(rèn): false)
register-mbeans: false
# 連接泄漏檢測(cè)閾值 (毫秒) (0表示禁用)
leak-detection-threshold: 0
# 驗(yàn)證連接是否可用的超時(shí)時(shí)間 (毫秒)
validation-timeout: 5000
# 連接池準(zhǔn)備就緒前是否阻塞應(yīng)用啟動(dòng) (默認(rèn): true)
initialization-fail-timeout: 1數(shù)據(jù)庫(kù)特定配置
MySQL 優(yōu)化配置
spring:
datasource:
hikari:
# MySQL 推薦配置
connection-timeout: 30000
max-lifetime: 1800000 # 30分鐘 (小于MySQL的wait_timeout)
idle-timeout: 600000 # 10分鐘
maximum-pool-size: 20
minimum-idle: 20
connection-test-query: SELECT 1
# MySQL 連接屬性
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
useLocalSessionState: true
rewriteBatchedStatements: true
cacheResultSetMetadata: true
cacheServerConfiguration: true
elideSetAutoCommits: true
maintainTimeStats: falsePostgreSQL 優(yōu)化配置
spring:
datasource:
hikari:
# PostgreSQL 推薦配置
maximum-pool-size: 15
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
# PostgreSQL 連接屬性
data-source-properties:
prepareThreshold: 3
preferQueryMode: extended
reWriteBatchedInserts: true生產(chǎn)環(huán)境推薦配置
spring:
datasource:
hikari:
pool-name: ${spring.application.name}-HikariCP
maximum-pool-size: ${DB_POOL_SIZE:20}
minimum-idle: ${DB_POOL_MIN_IDLE:20}
max-lifetime: ${DB_MAX_LIFETIME:1800000}
connection-timeout: ${DB_CONN_TIMEOUT:30000}
idle-timeout: ${DB_IDLE_TIMEOUT:600000}
leak-detection-threshold: ${DB_LEAK_DETECTION:0}
connection-test-query: SELECT 1
# MySQL 性能優(yōu)化參數(shù)
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
useLocalSessionState: true
rewriteBatchedStatements: true配置說(shuō)明與優(yōu)化建議
- 連接池大小計(jì)算:
- 推薦公式:
connections = ((core_count * 2) + effective_spindle_count) - 4核SSD系統(tǒng):
(4*2)+1 = 9 → 設(shè)置為10-20
- 推薦公式:
- max-lifetime 設(shè)置:
- 應(yīng)比數(shù)據(jù)庫(kù)的
wait_timeout小2-3分鐘 - MySQL默認(rèn)
wait_timeout是8小時(shí)(28800秒)
- 應(yīng)比數(shù)據(jù)庫(kù)的
- leak-detection-threshold:
- 開(kāi)發(fā)環(huán)境可設(shè)置為
60000(1分鐘)檢測(cè)連接泄漏 - 生產(chǎn)環(huán)境建議設(shè)為
0(禁用)以避免性能影響
- 開(kāi)發(fā)環(huán)境可設(shè)置為
- 監(jiān)控集成:
management:
endpoints:
web:
exposure:
include: health,metrics,info
endpoint:
health:
show-details: always
db:
enabled: true常見(jiàn)問(wèn)題解決
連接泄漏錯(cuò)誤:
hikari: leak-detection-threshold: 60000 # 1分鐘檢測(cè)
連接超時(shí)問(wèn)題:
hikari: connection-timeout: 60000 # 增加到60秒 initialization-fail-timeout: -1 # 永不超時(shí)
MySQL 8小時(shí)問(wèn)題:
hikari: max-lifetime: 28000000 # 比8小時(shí)(28800000)少80秒 connection-test-query: SELECT 1
HikariCP 的這些配置參數(shù)可以幫助您根據(jù)應(yīng)用需求優(yōu)化數(shù)據(jù)庫(kù)連接池性能,建議根據(jù)實(shí)際監(jiān)控?cái)?shù)據(jù)不斷調(diào)整優(yōu)化。
二、拓展
1、什么是MySQL 8小時(shí)問(wèn)題
MySQL 8小時(shí)問(wèn)題是指當(dāng)數(shù)據(jù)庫(kù)連接空閑時(shí)間超過(guò)8小時(shí)后,MySQL服務(wù)器會(huì)自動(dòng)斷開(kāi)連接,而連接池并不知道這個(gè)連接已經(jīng)失效,導(dǎo)致應(yīng)用嘗試使用這些被斷開(kāi)的連接時(shí)出現(xiàn)錯(cuò)誤的問(wèn)題。
問(wèn)題本質(zhì)
- MySQL默認(rèn)配置:
wait_timeout參數(shù)默認(rèn)為28800秒(8小時(shí))- 表示如果一個(gè)連接空閑超過(guò)8小時(shí),MySQL服務(wù)器會(huì)自動(dòng)關(guān)閉它
- 連接池行為:
- 連接池中的連接被應(yīng)用使用后返回到池中
- 如果連接長(zhǎng)時(shí)間未被使用(超過(guò)8小時(shí)),MySQL會(huì)關(guān)閉它
- 但連接池仍然認(rèn)為這些連接是有效的
- 問(wèn)題表現(xiàn):
- 應(yīng)用嘗試使用這些"僵尸連接"時(shí)會(huì)報(bào)錯(cuò):
Communications link failure The last packet successfully received from the server was X milliseconds ago
- 通常發(fā)生在應(yīng)用長(zhǎng)時(shí)間低負(fù)載運(yùn)行后(如夜間)
解決方案
1. 調(diào)整MySQL配置(不推薦)
-- 增加wait_timeout(不推薦,只是延遲問(wèn)題出現(xiàn)時(shí)間) SET GLOBAL wait_timeout=86400; -- 24小時(shí)
缺點(diǎn):只是推遲問(wèn)題發(fā)生時(shí)間,沒(méi)有根本解決
2. 優(yōu)化連接池配置(推薦)
HikariCP配置方案:
spring:
datasource:
hikari:
# 設(shè)置max-lifetime略小于wait_timeout(7小時(shí)50分鐘)
max-lifetime: 28200000 # 7小時(shí)50分鐘(單位毫秒)
# 連接測(cè)試查詢
connection-test-query: SELECT 1
# 空閑連接檢查
idle-timeout: 600000 # 10分鐘空閑后檢查Druid配置方案:
spring:
datasource:
druid:
# 定期檢查空閑連接
time-between-eviction-runs-millis: 60000 # 60秒檢查一次
min-evictable-idle-time-millis: 1800000 # 30分鐘空閑就回收
test-while-idle: true # 檢查空閑連接有效性
validation-query: SELECT 13. 最佳實(shí)踐組合
- 設(shè)置合理的max-lifetime:
- 比MySQL的wait_timeout少2-3分鐘
- 例如:
max-lifetime: 28000000(7小時(shí)46分40秒)
- 啟用連接測(cè)試:
hikari: connection-test-query: SELECT 1 # 或者使用更好的validation-timeout validation-timeout: 5000
定期心跳(適合生產(chǎn)環(huán)境):
-- 在MySQL中設(shè)置 SET GLOBAL interactive_timeout = 3600; SET GLOBAL wait_timeout = 3600;
問(wèn)題驗(yàn)證方法
查看當(dāng)前MySQL超時(shí)設(shè)置:
SHOW VARIABLES LIKE 'wait_timeout'; SHOW VARIABLES LIKE 'interactive_timeout';
- 模擬測(cè)試:
- 將wait_timeout設(shè)為很短時(shí)間(如60秒)
- 觀察連接池行為
- 監(jiān)控連接狀態(tài):
SHOW PROCESSLIST;
其他注意事項(xiàng)
- 不同驅(qū)動(dòng)的影響:
- MySQL Connector/J 8.0+有更好的連接失效檢測(cè)機(jī)制
- 建議使用最新驅(qū)動(dòng)
- 云數(shù)據(jù)庫(kù)差異:
- AWS RDS/Aurora等可能有不同的默認(rèn)超時(shí)設(shè)置
- 需要檢查云服務(wù)商的具體配置
- 連接泄漏的混淆:
- 真正的連接泄漏也會(huì)導(dǎo)致類(lèi)似錯(cuò)誤
- 需要區(qū)分是8小時(shí)問(wèn)題還是應(yīng)用代碼泄漏連接
通過(guò)合理配置連接池參數(shù)和MySQL參數(shù),可以完全避免8小時(shí)問(wèn)題,確保應(yīng)用穩(wěn)定運(yùn)行。
到此這篇關(guān)于Spring Boot HikariCP 連接池 YAML 配置詳解的文章就介紹到這了,更多相關(guān)Spring Boot HikariCP 連接池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot HikariCP連接池監(jiān)控實(shí)現(xiàn)方案
- SpringBoot整合HikariCP數(shù)據(jù)庫(kù)連接池方式
- Spring?Boot?快速使用?HikariCP?連接池配置詳解
- springboot2中HikariCP連接池的相關(guān)配置問(wèn)題
- SpringBoot?HikariCP連接池詳解
- SpringBoot4.5.2 整合HikariCP 數(shù)據(jù)庫(kù)連接池操作
- SpringBoot2.0 中 HikariCP 數(shù)據(jù)庫(kù)連接池原理解析
- Spring Boot如何使用HikariCP連接池詳解
相關(guān)文章
Win10安裝Maven與環(huán)境變量配置過(guò)程
本文介紹Maven的安裝與配置方法,涵蓋下載、環(huán)境變量設(shè)置、本地倉(cāng)庫(kù)及鏡像配置,指導(dǎo)如何在IDEA中正確配置Maven,適用于Java及其他語(yǔ)言項(xiàng)目的構(gòu)建與依賴管理2025-08-08
利用java模擬實(shí)現(xiàn)鍵盤(pán)鼠標(biāo)操作(附源碼)
這篇文章主要為大家詳細(xì)介紹了如何從零設(shè)計(jì)并實(shí)現(xiàn)一個(gè)功能完備的鍵盤(pán)鼠標(biāo)模擬庫(kù),提供比原生?Robot?更友好的?API,更高的可定制性和可擴(kuò)展性,感興趣的小伙伴可以了解一下2025-05-05
關(guān)于Spring BeanPostProcessor的執(zhí)行順序
這篇文章主要介紹了Spring BeanPostProcessor的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
通過(guò)pipeline配置sonar自動(dòng)化實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了通過(guò)pipeline配置sonar自動(dòng)化實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Mybatis 開(kāi)發(fā)注解快速入門(mén)
mybatis是一個(gè)支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。這篇文章主要介紹了Mybatis 開(kāi)發(fā)注解快速入門(mén)的相關(guān)資料,需要的朋友可以參考下2016-11-11

