BUG解决方案:莫名报错数据库连接失败com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not all
本文是将笔者遇到数据库连接问题时的解决分析思路以及解决方案分享出来,希望对你有所帮助。com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed的解决方案。
前言:本文是将笔者遇到数据库连接问题时的解决分析思路以及解决方案分享出来,希望对你有所帮助
目录
一.BUG描述
笔者之前很长一段时间都有这样一个困惑,本来项目跑的好好的,代码没问题,配置没问题,上一秒还正常运行呢,在不做更改的情况下下一秒就突然报错数据库连接出了问题,而且一连长串的报错信息中往往会有这样一个报错提示:
com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed
二.解决思路与分析
在刚开始无意间发现了这样的一个解决方案:
在IDEA中为了方便我们操作数据表而内置了数据库操作功能,虽然没有Navicat那么专业好用,但是也能带来不少便利,一次偶然使用MyBatis情况中我的项目出现了上述的报错,我刚开始以为是数据库某个字段和代码哪个地方可能发送冲突了,然后就通过IDEA自带的数据库访问功能打开查看了数据表,发现并没有任何问题,然后我就重新将项目启动起来了,神奇的是这一次竟然成功运行了,并没有报任何错误。
尤其是在导入数据源后,点击刷新图标就会发现不报错了
我首先怀疑的是可能没有启动MySQL服务,在手动配置数据源的时候IDEA可能帮我启动了MySQL服务,但是当我去查看的时候却发现MySQL的服务是一直启动的,并且开机就是自动启动的,因此可以排除MySQL服务未启动这样的情况。
结合报错信息思考,UnableToConnectException代表数据库连接驱动部分发送了错误,Public Key Retrieval is not allowed可以理解为访问不了公钥,那就说明是这个数据库连接请求被MySQL拒绝了,结合网上的查询的资料得出了以下结论。
这个错误通常是由于 MySQL 8.0 及更高版本的安全设置所引起的。在 MySQL 8.0 中,默认的身份验证插件被改为 caching_sha2_password
,而旧版本的 mysql-connector-java
可能不支持这种身份验证方式。此外,MySQL 8.0 默认禁止公共密钥检索,这可能导致在没有明确设置 allowPublicKeyRetrieval=true
的情况下无法连接数据库。
而对于为什么手动配置数据源就可以解决这样的问题,我猜测 IDEA 在处理数据源连接时,可能进行了某些优化,自动处理了类似 allowPublicKeyRetrieval
这样的参数问题。IDEA 内置的数据库工具和驱动程序管理应该能够自动检测到一些常见的问题并进行相应的处理,例如自动添加参数或使用兼容的驱动程序版本。这就是解释了在手动配置数据源时,不会遇到 Public Key Retrieval is not allowed
这样的问题,因为 IDEA 可能已经帮我们隐式处理了这些设置。
三.解决方案
对于这样的问题,我总结了三种解决方案(不包含上文中说的手动配置数据源的方案),当然你也可以为了方便而选择点击IDEA为我们提供的数据源刷新按钮,但这这种方案毕竟治病不治根,因而不推荐。
▐ 方案一
更新 MySQL 连接器版本: 确保你使用的是最新版本的 mysql-connector-java
,因为较新版本的连接器已经解决了与 caching_sha2_password
插件相关的问题。
▐ 方案二
在数据库连接URL中添加allowPublicKeyRetrieval=true
: 在 application.properties
或 application.yml
文件中,将数据库连接URL修改如下:
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
其中 allowPublicKeyRetrieval=true
允许公共密钥检索,从而避免出现这个错误。
▐ 方案三
更改 MySQL 用户的身份验证插件: 如果你不想在 URL 中添加参数,你可以更改 MySQL 用户的身份验证插件为 mysql_native_password
。你可以通过 MySQL 命令行执行以下命令:
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
这将会使 MySQL 用户使用旧的身份验证插件,从而避免与连接器之间的兼容性问题。
本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)