在使用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驱动程序,就会看到这个错误。

解决方案

解决这个问题的方法主要有两个:

  1. 修改连接URL:在你的JDBC连接字符串中添加allowPublicKeyRetrieval=true参数。这是最直接的方法,允许客户端通过公钥检索连接。

java String url = "jdbc:mysql://localhost:3306/yourDatabase?allowPublicKeyRetrieval=true&useSSL=false";

  1. 更改用户身份验证方法:如果不希望在连接字符串中添加allowPublicKeyRetrieval=true,可以将MySQL用户的身份验证方法更改为mysql_native_password,与旧版本兼容。

步骤: 1. 使用MySQL命令行或管理工具连接到数据库。 2. 执行以下SQL语句以修改用户的身份验证方法:

sql ALTER USER 'yourUser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourPassword';

  1. 重新加载权限:

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用户的验证方式,可以有效解决此问题。在实际开发中,建议根据具体需求选择合适的解决方案,并确保数据库连接的安全性。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部