在使用Java进行数据库操作时,特别是连接MySQL数据库,有时会遇到 java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed 的错误。这通常与MySQL的密码验证策略以及JDBC连接URL的配置有关。为了解决这个问题,我们需要先了解问题的原因,然后通过调整连接参数来解决。

错误原因

在MySQL 8.0版本及以上,默认的身份验证插件使用caching_sha2_password,这导致一些旧的JDBC连接配置可能无法正确建立连接。在进行身份验证时,JDBC需要从服务器获取公钥以进行密钥交换,但在某些情况下,默认的配置不允许这种公钥检索,从而导致上述异常。

解决方案

要解决此问题,有几种方法,其中最常用的是在连接URL中允许公钥检索。

方法一:调整连接URL

在连接数据库的URL中添加allowPublicKeyRetrieval=true参数,示例如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/yourDatabase?allowPublicKeyRetrieval=true&useSSL=false";
        String user = "yourUsername";
        String password = "yourPassword";

        try {
            Connection connection = DriverManager.getConnection(url, user, password);
            System.out.println("连接成功!");
            // 在这里进行数据库操作
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们添加了allowPublicKeyRetrieval=true参数,这告诉驱动程序允许从数据库服务器检索公钥。useSSL=false参数可以在调试时禁用SSL连接,如果在生产环境下建议开启SSL。

方法二:改变MySQL用户的身份验证插件

如果希望不在JDBC连接中使用这个参数,另外一个解决方案是改用支持传统身份验证的插件,如mysql_native_password。可以通过如下SQL命令来修改用户的身份验证插件:

ALTER USER 'yourUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourPassword';

在执行这条命令后,请记得刷新权限:

FLUSH PRIVILEGES;

然后使用标准的JDBC连接尝试重新连接数据库:

// 与之前相同的连接代码

通过这种方法,您的JDBC连接将使用mysql_native_password进行身份验证,通常会避免需要公钥检索的问题。

小结

在连接MySQL数据库时,java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed是一个常见的问题。通过在连接字符串中添加allowPublicKeyRetrieval=true参数可以快速解决此问题,或者您也可以更改MySQL用户的身份验证插件来避免使用新方法。无论选择哪种方法,都能有效地解决连接问题,确保您的Java应用能够顺利地与MySQL数据库进行交互。希望本文能够帮助您顺利解决问题。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部