MySQLNonTransientConnectionException问题求助:Tomcat应用连接MySQL报错
解决MySQL 8.x与JDBC驱动认证协议不兼容的问题
这个错误的核心原因是:MySQL 8.0默认启用了caching_sha2_password安全认证插件,但你代码里用的是旧版驱动类com.mysql.jdbc.Driver,它不支持这种新的认证协议。结合你使用的是8.0.11版本的Connector,给你两个直接有效的解决方案:
方案一:更新JDBC连接代码(推荐)
MySQL 8.x版本的驱动已经更新了类名和连接规则,你需要做两处调整:
- 替换驱动类名:把
com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver - 补充JDBC URL的必要参数:添加时区、允许公钥检索等参数,避免额外兼容性问题
修改后的代码如下:
// 加载新版驱动类 Class.forName("com.mysql.cj.jdbc.Driver"); // 补充必要的URL参数 String url = "jdbc:mysql://localhost:3306/pharmacy?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; Connection con = DriverManager.getConnection(url, "pharm", "@Pharm123");
关键参数说明:
serverTimezone=UTC:MySQL 8.x强制要求指定时区,否则会抛出时区相关异常allowPublicKeyRetrieval=true:允许客户端从服务器获取公钥,解决caching_sha2_password认证时的密钥获取问题useSSL=false:本地开发环境可关闭SSL,生产环境建议根据需求开启
方案二:修改MySQL用户的认证插件(备选)
如果方案一调整后仍有问题,可以把用户的认证方式切换回旧版的mysql_native_password,这是旧驱动兼容的认证方式:
执行以下SQL命令:
USE pharmacy; ALTER USER 'pharm'@'localhost' IDENTIFIED WITH mysql_native_password BY '@Pharm123'; FLUSH PRIVILEGES;
额外检查项
- 确认项目中只引入了MySQL Connector/J 8.0.11版本的jar包,不要同时存在5.x版本的驱动,避免依赖冲突
- 重启Tomcat服务器,确保所有配置修改生效
内容的提问来源于stack exchange,提问作者sachin sarangamath
相关产品推荐
相关产品推荐

