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. 超时时间不要过长或过短
相关推荐
DianSan_ERP8 分钟前
多平台订单自动下载与回传的技术实现:从消息推送到状态闭环引言
java·linux·服务器·前端·网络·架构·自动化
Joe_Wang510 分钟前
【从0到1学习JVM · 13】点进JDK源码只有一个分号?搞懂本地方法栈与JNI机制
java·jvm·学习·本地方法栈
AI 算法大模型备案~当当29 分钟前
各地备案数量怎么看:一份属地公告的认读与台账方法
java·数据库·人工智能
智鸟科技GemeOpen开发者智能设备36 分钟前
GemeOpen 智能音箱 GSSM0B - 播放控制(Java示例)
java·开发语言·智能音箱
今天的砖头有点烫手啊1 小时前
Java IO/NIO/AIO 演进:从 BIO 到 Netty 的底层逻辑
java·jvm·nio
梦帮科技1 小时前
量子张量网络破局大模型:从矩阵乘积态 (MPS) 到张量列 (TT-SVD) 低秩收缩全推导
网络·数据结构·数据库·线性代数·矩阵·架构·模拟退火算法
今年下半年1 小时前
【springboot】对接海康威视视频监控技术文档
spring boot·视频监控·安防·海康
曹牧1 小时前
PL/SQL Developer:导出建表语句
数据库·sql
念念不忘 必有回响1 小时前
MySQL 事务与隔离级别完全指南
数据库·mysql
谢亮_vipxieliang2 小时前
Java 21 新特性实战:Record、Sealed、模式匹配
java·开发语言