SpringBoot 数据库连接池配置(HikariCP)最佳实践

在 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 官方钦定的最强连接池,配置抓住三点即可:

    1. 最大连接数合理
    1. max-lifetime 小于数据库超时
    1. 超时时间不要过长或过短
相关推荐
一直不明飞行15 分钟前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker22 分钟前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
2301_8039346135 分钟前
Go语言如何做网络爬虫_Go语言爬虫开发教程【指南】
jvm·数据库·python
你的保护色1 小时前
【无标题】
java·服务器·网络
basketball6161 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
秋91 小时前
windows中安装redis
数据库·redis·缓存
淘矿人2 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
Cosolar2 小时前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
星浩AI2 小时前
OpenHuman 对比 OpenClaw、Hermes Agent
人工智能·后端·agent
想唱rap2 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++