关于JDBC连接数据库时出现的Public Key Retrieval is not allowed错误

本文介绍了在使用MyBatis框架访问mysql8数据库过程中遇到的PublicKeyRetrievalisnotallowed异常,提供了有效的解决方案,包括调整数据库连接URL参数等。
部署运行你感兴趣的模型镜像

问题描述

    最近在学习MyBatis框架,参考官方的文档通过配置文件的方式已经实现了通过Configuration配置文件和mapper映射文件访问mysql8数据库,于是想试试不使用XML文件去构建SqlSessionFactory,结合配置文件和官方文档,依次构建了DataSource,JdbcTransactionFactory,Configuration等等,并添加Mapper,在Mapper接口中通过注解配置了SQL语句,一步步的构建完成,前面都顺利执行没有抛出异常,当通过SqlSession拿到Mapper执行SQL语句的时候,抛出了Public Key Retrieval is not allowed异常。

解决过程

   通过一通百度,收集了可能导致这个问题的原因如下:

    1.mysql5及之前的版本使用的是旧版驱动"com.mysql.jdbc.Driver",mysql6以及之后的版本需要更新到新版驱动,对应的Driver是"com.mysql.cj.jdbc.Driver",但是这个驱动错误的信息是"Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.",排除这个原因。

    2.连接数据库的url中,加上allowPublicKeyRetrieval=true参数,经过验证解决该问题。

    3.网上看到另外的解决 办法,修改default_authentication_plugin设置,在my.ini中增加[mysqld]default_authentication_plugin=mysql_native_password,然后mysql命令行执行ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';最后在url中添加时区参数serverTimezone=Asia/Shanghai。

总结

    我用的第二种方法解决了,网上说的第三种方法是在数据库重启后遇到的,问题的原因也不甚清楚。不知道是不是mysql8才会遇到的一些坑。我在使用第二种方法连接成功一次后,再去掉allowPublicKeyRetrieval=true参数,还是能够正常连接,难道数据库连接过一次之后会自动缓存相同连接的配置信息吗,不是很懂。有懂的大佬还请指教。

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

### DBeaver 连接数据库出现 `Public Key Retrieval is not allowed` 错误的解决方法 在使用 DBeaver 连接 MySQL 数据库,如果出现 `Public Key Retrieval is not allowed` 错误,这通常是因为 MySQL 8.0 及以上版本默认禁用了公钥检索功能[^2]。以下是几种常见的解决方法: #### 方法 1:通过编辑连接配置启用公钥检索 1. 在 DBeaver 中右键点击无法连接数据库连接,选择 **Edit Connection**(编辑连接)。 2. 切换到 **Driver Properties**(驱动属性)选项卡。 3. 添加或修改以下属性: - `allowPublicKeyRetrieval = true` - `useSSL = false`(仅限开发环境)[^3] #### 方法 2:通过连接 URL 启用公钥检索 1. 在编辑连接,切换到 **Main**(主设置)选项卡。 2. 在 **URL** 字段中添加以下参数(注意开头使用 `?` 或 `&`): ```text ?allowPublicKeyRetrieval=true&useSSL=false ``` 3. 示例完整的 JDBC URL: ```text jdbc:mysql://localhost:3306/your_db?allowPublicKeyRetrieval=true&useSSL=false ``` #### 方法 3:更新驱动配置 1. 进入 **Connection Settings**(连接设置) → **Edit Driver Settings**(编辑驱动设置)。 2. 在 **Driver Properties**(驱动属性)中添加: - `allowPublicKeyRetrieval = true`[^3] #### 安全建议 - 对于生产环境,建议配置正确的 SSL 连接,而不是禁用 SSL。 - 如果可能,最好在 MySQL 服务器上将用户认证方式改为 `mysql_native_password`,以提高兼容性[^3]。 ### 示例代码 以下是一个使用 JDBC 连接 MySQL 数据库的示例代码,其中包含了 `allowPublicKeyRetrieval=true` 参数: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class MySQLConnection { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/your_db?allowPublicKeyRetrieval=true&useSSL=false"; String username = "your_username"; String password = "your_password"; try { Connection connection = DriverManager.getConnection(url, username, password); System.out.println("Connected to the database successfully!"); connection.close(); } catch (SQLException e) { System.err.println("Failed to connect to the database: " + e.getMessage()); } } } ``` ###
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值