mysql 8.0+ 连接异常主因是驱动类名和jar包未同步升级:必须将com.mysql.jdbc.driver彻底替换为com.mysql.cj.jdbc.driver,使用mysql-connector-j-8.3.0.jar,并在连接串中补全servertimezone=asia/shanghai、characterencoding=utf8、usessl=false和allowpublickeyretrieval=true四个参数。

com.mysql.jdbc.Driver 这个类在 MySQL 8.0+ 的驱动里根本不存在,不是“不推荐用”,是彻底删除了。报连接异常,90% 是因为还在用 mysql-connector-java-5.1.49.jar 或没改连接参数——不是数据库配错了,是协议和认证层已经不兼容。
驱动类名和 JAR 包必须一起换
只改配置里的 driver-class-name 不够,classpath 里还塞着旧 JAR,照样启动失败或静默异常。
-
com.mysql.jdbc.Driver必须全部替换成com.mysql.cj.jdbc.Driver,包括代码中Class.forName()、application.yml、db.properties、MyBatis<property name="driver" value="..."></property> - Maven 依赖必须删掉所有
mysql:mysql-connector-java:5.x,换成:<dependency><groupid>mysql</groupid><artifactid>mysql-connector-j</artifactid><version>8.3.0</version></dependency>
- Spring Boot 2.1+ 默认带 8.x 驱动,但如果你在
pom.xml里用<exclusions></exclusions>排除了它,又手动引了 5.x,那连接池加载的还是老驱动
连接 URL 缺这四个参数就会“能连不能查”
应用能启动、DataSource 能创建、甚至 getConnection() 都不报错,但第一次 executeQuery() 就卡住或返回空结果——这是最坑的静默失败。
-
serverTimezone=Asia/Shanghai:不能留空,也不能只写UTC;MySQL 8.0 默认强制校验,不声明会触发时区解析异常 -
characterEncoding=utf8:虽然服务端默认utf8mb4,但驱动不声明会导致中文字段截断或报Incorrect string value -
useSSL=false:开发环境必须加;生产环境要配证书并设为true,否则连接可能被拒绝 -
allowPublicKeyRetrieval=true:MySQL 8.0.4+ 强制要求,否则 RSA 密钥交换阶段直接卡死
完整示例:jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true(注意 XML/properties 中 & 要写成 &)
预编译语句缓存行为变了,ORM 查询可能失效
MyBatis 分页、IN 列表过长、动态 SQL 执行失败或返回空结果,大概率不是 SQL 写错了,是 cachePrepStmts 默认行为变了。
- 老驱动默认开启缓存但不限大小;新驱动未显式配置时会降级为禁用
- 导致 ORM 回退成普通语句执行,触发权限限制(如
SQL_NO_CACHE)、语法不兼容或 IN 参数超限 - 必须在连接 URL 或连接池
connectionProperties里补全:&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048 - Tomcat JDBC Pool 示例:
connectionProperties="cachePrepStmts=true;prepStmtCacheSize=250;prepStmtCacheSqlLimit=2048"
别忽略认证插件不匹配这个隐藏开关
如果还报 Authentication plugin 'caching_sha2_password' cannot be loaded 或 Client does not support authentication protocol,说明用户账号用了 MySQL 8.0 默认的 caching_sha2_password 插件,而驱动虽新但没配对上。
- 首选方案:确认驱动已是 8.0.4+,且连接 URL 含
allowPublicKeyRetrieval=true,再检查用户是否真用了该插件(SELECT host,user,plugin FROM mysql.user WHERE user='xxx';) - 次选方案:临时改用户认证方式(仅限测试环境):
ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; FLUSH PRIVILEGES;
- 不建议长期用
allowPublicKeyRetrieval=true生产环境,它会把公钥明文传给客户端,应优先配 SSL 证书
validationQuery=SELECT 1 太简单,会绕过时区、字符集、预编译等真实校验路径,掩盖问题。上线前务必用带业务字段的真实查询做一次集成验证。











