什么问题现在:"C:\Program Files\Java\jdk-17\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\lib\idea_rt.jar=50982:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\bin" -Dfile.encoding=UTF-8 -classpath C:\ideaWorkspace\untitled\untitled1\target\classes;C:\Users\TR\.m2\repository\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar;C:\Users\TR\.m2\repository\com\google\protobuf\protobuf-java\3.6.1\protobuf-java-3.6.1.jar jdbc.JDBCDemo1 Exception in thread "main" java.lang.RuntimeException: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at jdbc.JDBCDemo1.main(JDBCDemo1.java:22) Caused by: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835) at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229) at jdbc.JDBCDemo1.main(JDBCDemo1.java:13) Process finished with exit code 1
时间: 2025-03-25 10:10:29 浏览: 34
从错误信息来看,这是由于连接 MySQL 数据库时遇到了“Public Key Retrieval is not allowed”的异常。这个错误通常发生在使用 SSL 或者用户认证模式涉及公钥的情况下。
### 错误分析:
`java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed`
这表明数据库驱动程序尝试检索用户的公钥(用于身份验证),而当前配置不允许这样做。
---
### 解决方案:
#### 方法一:禁用公钥检索
如果你不需要启用公钥检索功能,可以在 JDBC URL 中添加参数 `allowPublicKeyRetrieval=false` (默认值就是 false)。例如:
```properties
jdbc:mysql://localhost:3306/your_database?useSSL=false&allowPublicKeyRetrieval=false
```
#### 方法二:显式设置用户名和密码
确保你在代码中明确传递了正确的用户名和密码,并避免依赖匿名登录或其他可能导致额外校验的方式。示例代码如下:
```java
String url = "jdbc:mysql://localhost:3306/your_database?useSSL=false";
String user = "root"; // 替换为实际的用户名
String password = "password"; // 替换为实际的密码
try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.println("Connected to the database!");
} catch (SQLException e) {
e.printStackTrace();
}
```
#### 方法三:检查 MySQL 用户权限及认证插件
如果以上方法无效,请确认以下几个方面:
1. **MySQL 的账户是否启用了旧版认证协议**
如果是新版本 MySQL,默认可能会使用更安全的身份验证机制(如 `caching_sha2_password`)。你需要将该账号切换回兼容的传统认证插件 (`mysql_native_password`)。
登录到 MySQL 命令行并运行以下命令:
```sql
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
```
2. **客户端与服务器端版本匹配**
确保使用的 MySQL 驱动版本支持目标数据库实例的特性。建议升级至最新稳定版本的 MySQL Connector/J 库。
---
### 总结
通过上述调整可以解决大部分因“Public Key Retrieval”引发的问题。不过还需要结合具体的业务场景进一步排查潜在隐患。
阅读全文
相关推荐



















