快速体验
- 打开 InsCode(快马)平台 https://www.inscode.net
- 输入框内输入如下内容:
创建一个Java应用演示如何处理MySQL的Public Key Retrieval异常。应用应包含:1) 展示引发异常的连接字符串示例;2) 提供两种修复方案(添加allowPublicKeyRetrieval=true参数和使用SSL证书);3) 包含测试代码验证解决方案;4) 输出详细的异常信息和解决步骤说明。使用JDBC和MySQL Connector/J实现,代码要有良好注释,适合开发者直接参考使用。 - 点击'项目生成'按钮,等待项目生成完整后预览效果

最近在开发一个Java应用连接MySQL数据库时,遇到了java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed这个异常。经过一番折腾和InsCode(快马)平台的帮助,终于搞清楚了原因和解决方法,这里把经验分享给大家。
异常现象
这个异常通常发生在使用JDBC连接MySQL 8.0及以上版本时。当我尝试用以下连接字符串连接数据库时就会报错:
jdbc:mysql://localhost:3306/mydb?useSSL=true
问题原因
- 安全策略变更:MySQL 8.0开始默认启用了更严格的安全策略
- SSL连接要求:当启用SSL连接时,客户端需要验证服务器身份
- 公钥获取限制:默认情况下服务器不允许客户端直接获取公钥
解决方案
经过在InsCode平台上测试和验证,我发现有两种可靠的解决方法:
方案一:添加allowPublicKeyRetrieval参数
- 修改连接字符串,添加
allowPublicKeyRetrieval=true参数 - 这种方案最简单,适合开发和测试环境
- 示例连接字符串:
jdbc:mysql://localhost:3306/mydb?useSSL=true&allowPublicKeyRetrieval=true
方案二:配置SSL证书
- 获取MySQL服务器的CA证书
- 在客户端配置信任该证书
- 添加
trustCertificateKeyStoreUrl和trustCertificateKeyStorePassword参数 - 这种方案更安全,适合生产环境
验证测试
为了验证解决方案的有效性,我通过以下步骤进行了测试:
- 首先尝试原始连接字符串,确认会抛出异常
- 然后分别测试两种解决方案的连接字符串
- 记录连接成功与否的结果
- 比较不同方案的性能差异
经验总结
- 开发环境:建议使用方案一,简单快捷
- 生产环境:推荐使用方案二,更安全可靠
- 版本兼容性:这个问题主要出现在MySQL 8.0+和某些JDBC驱动版本
- 调试技巧:可以在连接字符串中添加
logger=Slf4JLogger&profileSQL=true参数查看详细日志
在整个问题解决过程中,我使用了InsCode(快马)平台来快速测试不同的连接配置。平台提供的Java环境让我可以即时验证各种解决方案,无需在本地搭建复杂的测试环境。

特别是平台的AI助手功能,能够直接分析异常堆栈信息,给出可能的解决方案建议,大大缩短了调试时间。对于Java开发者来说,遇到这类数据库连接问题时,InsCode确实是一个很实用的工具。
快速体验
- 打开 InsCode(快马)平台 https://www.inscode.net
- 输入框内输入如下内容:
创建一个Java应用演示如何处理MySQL的Public Key Retrieval异常。应用应包含:1) 展示引发异常的连接字符串示例;2) 提供两种修复方案(添加allowPublicKeyRetrieval=true参数和使用SSL证书);3) 包含测试代码验证解决方案;4) 输出详细的异常信息和解决步骤说明。使用JDBC和MySQL Connector/J实现,代码要有良好注释,适合开发者直接参考使用。 - 点击'项目生成'按钮,等待项目生成完整后预览效果
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

被折叠的 条评论
为什么被折叠?



