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. 超时时间不要过长或过短
相关推荐
迈巴赫车主2 小时前
蓝桥杯3500阶乘求和java
java·开发语言·数据结构·职场和发展·蓝桥杯
夕颜1112 小时前
写 SIP 服务后台前,先把 SIP 和 PSTN 搞清楚
后端
码农BookSea2 小时前
为什么ChatGPT能听懂你说的话?Embedding技术揭秘
后端·openai
黑牛儿2 小时前
MySQL 索引实战详解:从创建到优化,彻底解决查询慢问题
服务器·数据库·后端·mysql
身如柳絮随风扬3 小时前
Lambda、方法引用与Stream流完全指南
java·开发语言
程序员飞哥3 小时前
到底Java 适不适合做 AI 呢?
后端·程序员·全栈
yaoyouzhong3 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
捧月华如3 小时前
RAG 入门-向量存储与企业级向量数据库 milvus
数据库·milvus
杨云龙UP3 小时前
Oracle Data Pump实战:expdp/impdp常用参数与导入导出命令整理_20260406
linux·运维·服务器·数据库·oracle