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. 超时时间不要过长或过短
相关推荐
zh1570236 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
代码AI弗森6 小时前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
Java开发的小李6 小时前
SpringBoot + Redis 实现分布式 Session 共享(解决多实例登录状态丢失问题)
spring boot·redis·分布式
Old Uncle Tom7 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
小小小米粒7 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
前端一小卒7 小时前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
摇滚侠7 小时前
expdp 查看帮助
java·数据库·oracle
流年似水~7 小时前
MCP协议实战:从零搭建一个让Claude能“看见“数据库的工具服务
数据库·人工智能·程序人生·ai·ai编程
2401_871492857 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
:1218 小时前
java基础
java·开发语言