MySQL 8.0 必须使用 com.mysql.cj.jdbc.Driver 驱动类,URL 需包含 useSSL=false、serverTimezone=Asia/Shanghai、allowPublicKeyRetrieval=true 和 characterEncoding=utf8 参数,缺一即报错;服务端还需配置 utf8mb4 字符集并建库指定。

MySQL 8.0 驱动类名和 URL 参数必须匹配
Spring Boot 2.7+ 默认用 com.mysql.cj.jdbc.Driver,不是旧版的 com.mysql.jdbc.Driver。如果写错,启动时会报 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。URL 中也必须带关键参数,否则连不上或报错:
-
useSSL=false:本地开发可关 SSL(生产环境应启用并配证书) -
serverTimezone=Asia/Shanghai:不加会抛The server time zone value '...' is unrecognized -
allowPublicKeyRetrieval=true:MySQL 8.0 默认认证插件是caching_sha2_password,不加这个会卡在Public Key Retrieval is not allowed -
characterEncoding=utf8:注意这里写utf8,不是utf8mb4—— JDBC 驱动只认 Java 标准名UTF-8,而utf8mb4是 MySQL 服务端概念;写成characterEncoding=utf8mb4会直接触发Unsupported character encoding 'utf8mb4'
完整示例:jdbc:mysql://localhost:3306/springdb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&characterEncoding=utf8
HikariCP 是默认连接池,无需额外依赖
Spring Boot 2.0+ 内置 HikariCP,只要引入了 spring-boot-starter-data-jpa 或 spring-boot-starter-jdbc,就自动启用它。不需要再手动加 HikariCP 的 Maven 依赖。
但要注意:如果你显式引入了 druid-spring-boot-starter,它会覆盖 HikariCP —— 这不是 bug,是 Spring Boot 的自动配置优先级规则。是否换 Druid,取决于你是否真需要它的监控页面或 SQL 防火墙功能。
调优建议(application.yml):
-
spring.datasource.hikari.maximum-pool-size: 20:默认是 10,小项目够用,压测或高并发场景建议设到 20–30 -
spring.datasource.hikari.connection-timeout: 30000:超时时间太短(如 5000)会导致偶发连接失败被误判为数据库宕机 -
spring.datasource.hikari.idle-timeout: 600000:空闲连接 10 分钟才回收,避免频繁创建销毁 - 别配
minimum-idle到 0 —— HikariCP 在空闲时会主动维持最小连接数,设为 0 可能导致首次请求延迟明显升高
字符集和服务端 utf8mb4 必须协同生效
只在 JDBC URL 里写 characterEncoding=utf8 不够。MySQL 服务端本身也得用 utf8mb4,否则 emoji 和生僻字仍会乱码或截断。
检查并设置方式:
- 登录 MySQL 执行:
SHOW VARIABLES LIKE 'character_set%';,确认character_set_server和collation_server是utf8mb4和utf8mb4_0900_ai_ci - 修改
/etc/mysql/my.cnf(Linux)或my.ini(Windows),在[mysqld]下加:character-set-server = utf8mb4collation-server = utf8mb4_0900_ai_ci - 建库时显式指定:
CREATE DATABASE springdb CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; - 用户权限语句里不用改,但确保该用户对这个库有操作权
漏掉任意一环,都可能出现「存进去是 ?,查出来是 」这类现象。
Druid 替换 HikariCP 时的配置差异点
如果确实要用 Druid(比如要访问 /druid/index.html 监控页),除了加依赖,配置结构完全不同 —— 它不走 spring.datasource.* 前缀,而是用 spring.datasource.druid.*。
关键易错项:
-
spring.datasource.druid.driver-class-name必须显式写,不能省略 -
validationQuery要写成SELECT 1或SELECT 'x',不能带分号,否则 Druid 初始化失败 -
testWhileIdle: true推荐开启,但testOnBorrow和testOnReturn建议关掉,否则每次取连接都执行校验,性能损耗大 -
webStatFilter.urlPattern: /druid/*必须配对,否则监控页面打不开;且路径不能写成/druid/**,Druid 不识别双星号
Druid 的密码明文写在配置里很危险,上线前务必用配置中心或 Jasypt 加密处理。
实际连通性验证永远比配置看起来更“脆弱”:MySQL 服务没起来、防火墙拦了 3306、root 密码其实是安装时随机生成的、甚至只是 application.yml 缩进多了一个空格——这些细节比驱动版本或连接池选型更容易让整个流程卡住。


















