在 SpringBoot 里,数据库连接池早就不是可选项,从 2.x 版本开始,SpringBoot 已经把 HikariCP 设为默认连接池,它以"极快、轻量、稳定"著称,也是目前线上最主流的选择。
本篇文章就来讲讲HikarcCP的配置参数、调优思路、注意事项。
一、为什么用 HikariCP?
-
• 官方默认,无需额外引入
-
• 性能吊打 C3P0、DBCP2、Tomcat-JDBC
-
• 轻量无锁设计,高并发下表现极稳
-
• 配置简单,坑少
-
• 支持监控、动态调整
二、依赖(默认已集成)
只要引入 JDBC / MyBatis / JPA 就自动包含:
go
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
三、相关配置信息
application.yml
go
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# HikariCP 核心配置(生产最佳实践)
hikari:
# 连接池名字,便于监控
pool-name: HikariCP-Pool
# 最小空闲连接(建议 = 最大连接,减少波动)
minimum-idle: 10
# 最大连接数(核心!根据业务压测调整,一般 10~30 足够)
maximum-pool-size: 20
# 自动提交
auto-commit: true
# 连接最大存活时间(毫秒),必须小于 MySQL wait_timeout(默认 8 小时)
max-lifetime: 300000
# 连接超时时间:获取连接等待超时时间
connection-timeout: 5000
# 空闲连接检测周期
idle-timeout: 60000
# 测试连接是否可用的查询语句
connection-test-query: SELECT 1
四、关键参数详解
1. maximum-pool-size 最大连接数
-
• 不是越大越好
-
• 单实例推荐:10~30
-
• CPU 密集型:小一点
-
• IO 密集型(大量查询):可适当加大
-
• 公式参考:
连接数 = ((核心数 * 2) + 有效磁盘数)
2. max-lifetime 连接最大生命周期
-
• 必须 < MySQL 的 wait_timeout(默认 8 小时)
-
• 建议设为 5 分钟 ~ 10 分钟
-
• 防止连接被 MySQL 主动断开而池里不知道
3. connection-timeout
获取连接等待超时时间,建议 3~5 秒,避免请求无限阻塞。
4. minimum-idle
建议与 maximum-pool-size 相同,关闭"收缩机制",更稳定。
五、SpringBoot 中使用 HikariTemplate
go
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<User> list() {
return jdbcTemplate.query(
"select * from user",
new BeanPropertyRowMapper<>(User.class)
);
}
}
MyBatis / MyBatis-Plus 同样自动走 Hikari 连接池,无需任何改动。
六、查看 Hikari 监控信息
go
@Component
public class HikariMonitor {
@Autowired
private DataSource dataSource;
public void showPoolState() {
HikariDataSource hikari = (HikariDataSource) dataSource;
HikariPoolMXBean poolBean = hikari.getHikariPoolMXBean();
System.out.println("活跃连接数:" + poolBean.getActiveConnections());
System.out.println("空闲连接数:" + poolBean.getIdleConnections());
System.out.println("等待连接数:" + poolBean.getPendingThreads());
System.out.println("总连接数:" + poolBean.getTotalConnections());
}
}
高并发排查非常有用。
七、注意事项
1. 获取连接超时(Connection Timeout)
-
• 最大连接数太小
-
• SQL 执行太慢,占着连接不释放
-
• 事务太长
2. MySQL 8.0 连接断开
- • URL 加上:
&allowPublicKeyRetrieval=true&useSSL=false
3. 连接泄漏(Connection Leak)
-
• 事务未提交/回滚
-
• 代码未释放资源
-
• 开启 leak-detection-threshold 监控
4. 高并发下性能上不去
-
• 调大
maximum-pool-size -
• 检查慢SQL
-
• 检查索引
八、与其他连接池对比
-
• HikariCP:快、稳、默认首选
-
• Druid:功能强、监控全、较重
-
• DBCP2:老项目用,性能一般
-
• C3P0:几乎淘汰
九、总结
HikariCP 是 SpringBoot 官方钦定的最强连接池,配置抓住三点即可:
-
- 最大连接数合理
-
- max-lifetime 小于数据库超时
-
- 超时时间不要过长或过短