Spring Boot数据库连接池优化
Spring Boot 2.x 默认使用 HikariCP 作为数据库连接池。
HikariCP核心配置
YAML
spring:
datasource:
hikari:
# 连接池大小
maximum-pool-size: 20
minimum-idle: 5
# 超时配置
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
# 连接验证
validation-timeout: 5000
leak-detection-threshold: 60000
# 连接池名称
pool-name: SpringBootHikariCP
参数详解
| 参数 | 默认值 | 说明 |
|---|---|---|
| maximum-pool-size | 10 | 最大连接数 |
| minimum-idle | 与max相同 | 最小空闲连接 |
| connection-timeout | 30000ms | 获取连接超时 |
| idle-timeout | 600000ms | 空闲连接超时 |
| max-lifetime | 1800000ms | 连接最大存活时间 |
| leak-detection-threshold | 0 | 连接泄露检测阈值 |
连接数计算公式
YAML
最大连接数 = (核心数 * 2) + 有效磁盘数
示例:4核CPU + 1块磁盘
最大连接数 = (4 * 2) + 1 = 9
实际需结合并发量和SQL执行时间调整。
连接池监控
Actuator端点
Java
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: health,metrics
自定义监控
Java
@Component
public class HikariMetrics {
@Autowired
private DataSource dataSource;
@Scheduled(fixedRate = 5000)
public void monitorHikariPool() {
HikariDataSource hikari = (HikariDataSource) dataSource;
HikariPoolMXBean pool = hikari.getHikariPoolMXBean();
log.info("活跃连接: {}, 空闲连接: {}, 等待线程: {}",
pool.getActiveConnections(),
pool.getIdleConnections(),
pool.getThreadsAwaitingConnection());
}
}
常见问题排查
连接泄露
Java
现象:日志出现 "Connection leak detection"
原因:未正确关闭数据库连接
解决:检查事务管理,确保使用 @Transactional
连接等待超时
text
现象:SQL执行报 "Connection is not available"
原因:连接池过小或SQL执行过慢
解决:增大连接池或优化慢SQL
连接池预热
text
@Component
public class PoolWarmUp implements ApplicationRunner {
@Autowired
private DataSource dataSource;
@Override
public void run(ApplicationArguments args) {
HikariDataSource hikari = (HikariDataSource) dataSource;
// 初始化最小空闲连接
hikari.getHikariPoolMXBean().getIdleConnections();
}
}
多数据源配置
text
@Configuration
public class DataSourceConfig {
@Primary
@Bean("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
}
优化建议
| 场景 | 建议配置 |
|---|---|
| 高并发短连接 | 增大maximum-pool-size |
| 长时间事务 | 增大max-lifetime |
| 连接不稳定 | 减小validation-timeout |
| 开发环境 | 设置leak-detection检测 |
要点总结
- maximum-pool-size按CPU核心数计算
- minimum-idle与maximum保持一致减少抖动
- 开启leak-detection检测连接泄露
- 生产环境配置连接池监控告警
📝 发现内容有误?点击此处直接编辑