小易说IT 小易说IT

SpringBoot + HikariCP 完整配置(适配 `mysql_native_password` / `caching_sha2_password`)

SpringBoot2.x/3.x 默认 HikariCP,无需额外引入依赖;MyBatis/MyBatis-Plus 直接复用 Hikari 数据源,不需要额外配置 驱动:mysql-connector-java 8.x,驱动类:com.mysql.cj.jdbc.Driver 两个认证模式:

  • 模式 A:mysql_native_password(兼容老账号,迁移临时方案)

  • 模式 B:caching_sha2_password(MySQL8 默认,分 SSL、本地 RSA 公钥、测试自动拉取公钥 3 种子场景)

Maven 依赖(基础必备)

<!-- SpringBoot JDBC 自带HikariCP -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL Connector 8.x -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
    <scope>runtime</scope>
</dependency>
<!-- MyBatis 可选 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.3.1</version>
</dependency>

SpringBoot3 注意:javax.* 包改为 jakarta.*,mybatis 版本对应升级,mysql 驱动可以继续 8.0.33。


场景 1:账号使用 mysql_native_password(老迁移场景,无需 RSA/SSL)

账号 SQL:

ALTER USER 'dbuser'@'%' IDENTIFIED WITH mysql_native_password BY 'Db@Pass123456';
FLUSH PRIVILEGES;

application.yml

spring:
  datasource:
    # JDBC URL:native认证不需要RSA参数
    url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true
    username: dbuser
    password: Db@Pass123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    # HikariCP 连接池完整参数
    hikari:
      # 连接池名称,便于监控
      pool-name: Hikari-MySQL
      # 最小空闲连接
      minimum-idle: 5
      # 最大连接数,根据业务调整,不要过大
      maximum-pool-size: 20
      # 空闲连接超时时间,单位ms,>10s
      idle-timeout: 300000
      # 连接最大生命周期,比mysql wait_timeout小(mysql默认wait_timeout=8小时)
      max-lifetime: 1800000
      # 获取连接超时
      connection-timeout: 30000
      # 测试连接有效性SQL
      connection-test-query: SELECT 1
      # 是否自动提交事务
      auto-commit: true
      # 连接泄漏检测,开发环境打开,生产按需
      leak-detection-threshold: 2000
mybatis:
  mapper-locations: classpath:mapper/**/*.xml
  type-aliases-package: com.xxx.entity

场景 2:账号 caching_sha2_password(MySQL8 默认认证)

2.1 子场景:开启 SSL【✅生产推荐首选】

MySQL 服务端已配置 SSL 证书,链路加密,不需要 RSA 公钥参数

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true
    username: dbuser
    password: Db@Pass123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      pool-name: Hikari-MySQL
      minimum-idle: 5
      maximum-pool-size: 20
      idle-timeout: 300000
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: SELECT 1
      auto-commit: true
      leak-detection-threshold: 2000
mybatis:
  mapper-locations: classpath:mapper/**/*.xml
  type-aliases-package: com.xxx.entity

2.2 子场景:内网无 SSL,本地预置 RSA 公钥文件【✅内网安全备选】

不开启 SSL,使用本地预存 mysql 公钥文件,禁止 allowPublicKeyRetrieval

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true&serverRsaPublicKeyFile=/opt/app/mysql_pubkey.pem
    username: dbuser
    password: Db@Pass123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      pool-name: Hikari-MySQL
      minimum-idle: 5
      maximum-pool-size: 20
      idle-timeout: 300000
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: SELECT 1
      auto-commit: true
mybatis:
  mapper-locations: classpath:mapper/**/*.xml

2.3 子场景:内网测试,无 SSL,自动拉取公钥【❌仅测试,生产严禁】

allowPublicKeyRetrieval=true 中间人风险,仅本地开发临时调试

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
    username: dbuser
    password: Db@Pass123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      pool-name: Hikari-MySQL
      minimum-idle: 5
      maximum-pool-size: 20
      idle-timeout: 300000
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: SELECT 1
      auto-commit: true
mybatis:
  mapper-locations: classpath:mapper/**/*.xml
  type-aliases-package: com.xxx.entity

Java Config 代码方式(非 yml,适合多数据源场景)

同样支持两种认证,只需要修改jdbcUrl字符串即可

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        // ========= 切换不同认证,只改这个url =========
        // mysql_native_password
        // String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4";
        // caching_sha2_password + SSL
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/mydb?useSSL=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4";

        config.setJdbcUrl(jdbcUrl);
        config.setUsername("dbuser");
        config.setPassword("Db@Pass123456");
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");

        // Hikari参数
        config.setPoolName("Hikari-MySQL");
        config.setMinimumIdle(5);
        config.setMaximumPoolSize(20);
        config.setIdleTimeout(300000);
        config.setMaxLifetime(1800000);
        config.setConnectionTimeout(30000);
        config.setConnectionTestQuery("SELECT 1");
        config.setAutoCommit(true);
        return new HikariDataSource(config);
    }
}

Hikari 关键参数说明(踩坑重点)

  1. max-lifetime:必须小于 MySQL 的 wait_timeout。MySQL 默认wait_timeout=28800(8 小时),这里设置 30 分钟 (1800000ms),避免连接被 mysql 服务端断开,Hikari 拿到死连接。

  2. connection-test-query: SELECT 1:HikariCP >= 2.4.0 支持isValid()检测,推荐可以不写,底层驱动自带校验,省去一次查询开销;如果数据库驱动老旧再开启。

  3. rewriteBatchedStatements=true:批量 insert/update 时开启,大幅提升 MyBatis 批量性能。

认证相关常见坑

  1. 认证插件是 caching_sha2_password,url 缺少 SSL/RSA 参数 → Public key retrieval is not allowed

    • 生产:开启 SSL;测试临时加allowPublicKeyRetrieval=true

  2. 账号插件 mysql_native_password,驱动 8.x 完全不需要 RSA 参数,加了也不报错,但多余

  3. 连接池参数和密码认证插件无关,认证逻辑全部在 JDBC 驱动,Hikari 只负责连接管理。

查看 mysql 账号认证插件 SQL

SELECT user,host,plugin FROM mysql.user WHERE user='dbuser';

选型总结

账号认证

推荐连接方式

适用场景

mysql_native_password

useSSL=false

5.7 迁移临时兼容,短期过渡

caching_sha2_password

useSSL=true

公网 / 生产环境【首选】

caching_sha2_password

useSSL=false + serverRsaPublicKeyFile

内网环境,不启用 SSL,安全方案

caching_sha2_password

useSSL=false + allowPublicKeyRetrieval=true

仅本地开发测试,生产禁止