在使用MySQL数据库的Java项目中,开发者常常会遇到com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed
的错误。这个错误通常与MySQL的连接配置有关,尤其是在使用MySQL 8.0及以上版本时,由于安全性提升,默认情况下不允许通过公钥检索进行连接,导致连接失败。以下是关于如何解决这个问题的详细说明以及代码示例。
问题分析
这一错误信息通常出现在你尝试连接MySQL数据库时, JDBC驱动程序无法获取服务器的公钥。MySQL 8.0 默认启用了caching_sha2_password
进行身份验证,而某些情况下,在客户端与服务器之间的连接可能无法获取该公钥,进而导致连接问题。
为了提升安全性,MySQL 8.0版本不再默认允许客户端在连接时进行公钥检索,这意味着,如果你使用的是无设置或旧版本的JDBC驱动程序,就会看到这个错误。
解决方案
解决这个问题的方法主要有两个:
- 修改连接URL:在你的JDBC连接字符串中添加
allowPublicKeyRetrieval=true
参数。这是最直接的方法,允许客户端通过公钥检索连接。
java
String url = "jdbc:mysql://localhost:3306/yourDatabase?allowPublicKeyRetrieval=true&useSSL=false";
- 更改用户身份验证方法:如果不希望在连接字符串中添加
allowPublicKeyRetrieval=true
,可以将MySQL用户的身份验证方法更改为mysql_native_password
,与旧版本兼容。
步骤: 1. 使用MySQL命令行或管理工具连接到数据库。 2. 执行以下SQL语句以修改用户的身份验证方法:
sql
ALTER USER 'yourUser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourPassword';
- 重新加载权限:
sql
FLUSH PRIVILEGES;
使用示例
以下是一个Java代码示例,展示了如何使用JDBC通过添加参数成功连接到MySQL数据库:
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/yourDatabase?allowPublicKeyRetrieval=true&useSSL=false";
String user = "yourUser";
String password = "yourPassword";
Connection connection = null;
try {
// 加载JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 连接数据库
connection = DriverManager.getConnection(url, user, password);
System.out.println("成功连接到数据库!");
// 这里可以进行数据库操作
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("JDBC驱动加载失败!");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库连接失败!");
} finally {
// 确保连接被关闭
try {
if (connection != null) {
connection.close();
System.out.println("连接已关闭。");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
总结
com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed
这个问题主要源于MySQL 8.0的安全设置。通过在JDBC连接字符串中添加allowPublicKeyRetrieval=true
,或者通过修改MySQL用户的验证方式,可以有效解决此问题。在实际开发中,建议根据具体需求选择合适的解决方案,并确保数据库连接的安全性。