在使用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数据库进行交互。希望本文能够帮助您顺利解决问题。