最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何解决MySQL升级后旧版JDBC驱动不兼容产生的连接异常
时间:2026-06-19 08:55:46 编辑:袖梨 来源:一聚教程网
MySQL 8.0+ 连接失败主因是驱动类和参数不兼容:必须将 com.mysql.jdbc.Driver 替换为 com.mysql.cj.jdbc.Driver,使用 mysql-connector-j-8.x.jar,并在连接串中补全 serverTimezone、characterEncoding、useSSL=false 和 allowPublicKeyRetrieval=true。
MySQL 升级到 8.0+ 后连不上,90% 是因为还在用 mysql-connector-java-5.x 驱动或没改连接参数——不是数据库配错了,是客户端协议和认证方式已经不兼容。
com.mysql.jdbc.Driver 报 ClassNotFoundException 怎么办
这个类在 MySQL 8.0+ 的驱动里根本不存在了。老项目里硬编码、application.yml 或 db.properties 中写的 com.mysql.jdbc.Driver 必须全部替换成 com.mysql.cj.jdbc.Driver。
- 检查 classpath 下的 JAR 名:必须是
mysql-connector-java-8.x.x.jar或mysql-connector-j-8.x.x.jar(8.3.0+ 推荐),不能是mysql-connector-java-5.1.49.jar这类 - Maven 依赖要彻底删掉旧版,换成:
<dependency><br> <groupId>mysql</groupId><br> <artifactId>mysql-connector-j</artifactId><br> <version>8.3.0</version><br></dependency>
- 代码里调用
Class.forName("com.mysql.jdbc.Driver")的地方,直接删掉——新驱动通过 SPI 自动注册,手动加载反而可能触发警告
连接成功但查不出数据或报时区/字符集错
只换驱动类名远远不够。MySQL 8.0 默认强制校验时区、默认用 utf8mb4、默认要求 SSL,老连接串缺参数会导致静默失败:应用能启动、Connection 对象能创建,但第一次 executeQuery 就卡住或返回空结果。
- 完整连接 URL 至少要带这四个参数:
?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true -
serverTimezone不能留空或写UTC就完事——业务时间逻辑依赖本地时区,Asia/Shanghai更稳妥 -
characterEncoding=utf8不是可选:虽然 MySQL 8.0 默认是utf8mb4,但驱动不声明会把某些中文字段截断或报Incorrect string value -
useSSL=false在开发环境必须加;生产环境应配证书并设为true,否则连接可能被拒绝 -
allowPublicKeyRetrieval=true是 8.0.4+ 强制要求,否则 RSA 密钥交换阶段就卡死
MyBatis 分页/IN 查询失效或返回空结果
这不是 SQL 写错了,是预编译语句缓存行为变了。老驱动默认开启 cachePrepStmts=true,新驱动不显式配置缓存大小时会降级为禁用,导致 ORM 动态 SQL 回退成普通语句执行,触发权限限制或语法不兼容。
- 在连接 URL 里补上:
&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048 - 尤其影响
IN (?, ?, ?...)列表过长、LIMIT ?,?分页等场景,不加可能直接返回空集合 - Spring Boot 用户注意:
spring-boot-starter-jdbc2.1+ 虽默认带 8.x 驱动,但若你<exclusions>掉它又手动引入了 5.x,照样踩坑
连得上但报 Plugin caching_sha2_password could not be loaded
这是 MySQL 8.0 默认认证插件变更导致的。JDBC 5.x、旧版 Navicat、DBeaver 等客户端根本不认识 caching_sha2_password,哪怕驱动和 URL 都对,也会在登录阶段拒连。
- 最稳方案:给对应用户切回旧插件:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - 不建议改
my.cnf的default_authentication_plugin:只影响新用户,已存在的用户不会自动更新,且重启服务有风险 - 别信“加个
allowPublicKeyRetrieval=true就能绕过”的说法——它解决的是密钥交换问题,不是认证插件不识别问题
真正麻烦的点不在驱动换没换,而在于每个参数改动都可能引发连锁反应:比如 useSSL=false 解决了连接,却让某些安全扫描工具直接标红;serverTimezone=Asia/Shanghai 解决了时间错乱,但在跨时区部署时又得动态切换。这些细节不写进配置、不验证到真实查询,光靠启动日志是看不出问题的。
相关文章
- 明末渊虚之羽防具有哪些排名 07-02
- 如何获取和平精英皮肤照片 07-02
- 空洞骑士丝之歌如何获取制造金属 07-02
- 鱼骨头螃蟹阵容如何搭配 07-02
- 战魂旅人玩法是什么 07-02
- 无限暖暖祝你幸福发饰如何获取 07-02