spring boot 2.x+ 默认集成 hikaricp,只需引入 jdbc、mybatis 或 jpa 启动器;mysql 8.0 需用 8.x 驱动、正确 url(含时区、编码、ssl 参数);application.yml 配置 5 行即可启用稳定连接池。

直接上手就能用,不需要额外引入依赖,Spring Boot 2.x+ 默认已集成 HikariCP。 只要加了 spring-boot-starter-jdbc、mybatis-spring-boot-starter 或 spring-boot-starter-data-jpa,HikariCP 就自动在类路径里了。
确认 MySQL 8.0 驱动和 URL 正确性
MySQL 8.0 必须用 mysql-connector-java 8.x(推荐 8.0.33+),驱动类名是 com.mysql.cj.jdbc.Driver,不是旧版的 com.mysql.jdbc.Driver。URL 中必须显式指定时区和编码,否则启动报错或中文乱码:
-
serverTimezone=Asia/Shanghai—— 缺失会导致java.sql.SQLException: The server time zone value '...' is unrecognized -
useUnicode=true&characterEncoding=utf-8—— 防止插入/查询中文出问题 -
allowPublicKeyRetrieval=true&useSSL=false—— 开发环境快速绕过 SSL 和密钥检索限制(生产环境应配 TLS)
完整示例:jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
application.yml 中最简可用配置
只需 5 行核心参数,就能让连接池稳定工作(无需写 spring.datasource.type,Spring Boot 会自动识别):
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?...
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
datasource.hikari:
maximum-pool-size: 10
minimum-idle: 10
connection-timeout: 3000
idle-timeout: 600000
max-lifetime: 1800000
说明:
-
maximum-pool-size和minimum-idle设为相等,关闭连接池“缩容”行为,避免低峰期连接被回收后高峰重建开销 -
max-lifetime设为 30 分钟(1800000 毫秒),必须比 MySQL 的wait_timeout(默认 28800 秒 = 8 小时)小至少 2–3 分钟,否则连接会被 MySQL 主动踢掉而池内无感知 -
connection-timeout: 3000是关键——超时太长(如默认 30 秒)会让前端请求卡住;太短(
解决“半夜连接失效”必须加的保活参数
如果应用夜间空闲后第二天首次请求报 Communications link failure,说明连接被 MySQL 清退但 HikariCP 还在分发。光靠 max-lifetime 不够,得加三层检测:
-
keepalive-time: 30000—— 每 30 秒发一次 TCP keepalive 包,防止中间网络设备断连(仅 HikariCP 5.0.0+ 支持) -
validation-timeout: 250—— 验证连接是否有效时,最多等 250ms,不能拖慢获取连接流程 -
connection-test-query: SELECT 1—— MySQL 8.0 推荐用/* ping */ SELECT 1,更轻量(注意:YAML 中带空格需加引号)
补全后的保活段落:
datasource.hikari:
keepalive-time: 30000
validation-timeout: 250
connection-test-query: "/* ping */ SELECT 1"
容易被忽略的两个硬坑
一是 leak-detection-threshold 默认关闭,线上建议设为 60000(60 秒),能捕获未 close 的 Connection 或 PreparedStatement 泄漏;二是 auto-commit 虽然默认 true,但如果用了声明式事务(@Transactional),它会被 Spring 自动覆盖,无需手动关——但如果你手动管理事务,务必确认这个值与业务逻辑一致,否则可能提交失败却不报错。











