“C:\Program Files\Java\jdk1.8.0_131\bin\java.exe” -javaagent:C:\app\IntelliJIDEA2023.1\lib\idea_rt.jar=51992:C:\app\IntelliJIDEA2023.1\bin -Dfile.encoding=UTF-8 -classpath “C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;C:\workspace\springboot-day01\logininterface\out\production\logininterface;C:\workspace\springboot-day01\logininterface\web\WEB-INF\lib\mybatis-3.5.7.jar;C:\workspace\springboot-day01\logininterface\web\WEB-INF\lib\mysql-connector-j-9.2.0.jar” com.xxxx.text.Tes Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed The error may exist in com/xxxx/mapper/UserMapper.xml The error may involve com.xxxx.mapper.UserMapper.queryUserByName The error occurred while executing a query Cause: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
时间: 2025-06-19 22:16:36 浏览: 17
<think>好的,我现在要处理用户遇到的这个Java异常。用户提供的错误信息是“Public Key Retrieval is not allowed”,看起来和数据库连接有关。首先,我需要理解这个错误的原因。
用户使用的是MySQL Connector/J驱动,可能版本较新。根据经验,MySQL 8.0以后的版本默认使用caching_sha2_password身份验证插件,而旧版本的驱动可能不支持或者需要额外配置。当连接数据库时,如果驱动无法正确获取公钥,就会出现这个错误。通常,解决办法是在JDBC连接URL中添加参数,比如allowPublicKeyRetrieval=true,或者调整SSL设置,比如useSSL=false。
接下来,我需要确认用户的具体情况。用户使用的驱动是mysql-connector-j-9.2.0.jar,这个版本应该支持MySQL 8.0,但可能由于安全限制默认不允许公钥检索。所以解决方案应该是在连接字符串中添加allowPublicKeyRetrieval=true,并且可能还需要设置useSSL=false,特别是如果测试环境没有配置SSL的话。
然后,检查用户提供的JDBC URL是否正确配置了这些参数。如果没有,就需要修改。同时,可能还需要检查MySQL服务器的用户权限设置,确保用户允许从远程主机连接,并且密码正确。
另外,用户可能没有正确配置SSL,或者服务器要求SSL而客户端未启用,这时候设置useSSL=false可以暂时解决问题,但生产环境中不建议这样做,应该正确配置SSL。
最后,提醒用户如果修改后仍然有问题,可能需要更新驱动版本,或者检查其他可能的配置问题,比如时区设置、防火墙等。</think>这个错误是由于MySQL数据库连接时公钥检索未被允许导致的。主要发生在使用MySQL 8.0+版本且未正确配置JDBC连接参数时。以下是解决方案和原因解释:
**解决方案**:
在数据库连接URL中添加以下两个参数:
```properties
jdbc:mysql://localhost:3306/dbname?allowPublicKeyRetrieval=true&useSSL=false
```
**原因解释**:
1. MySQL 8.0+默认使用`caching_sha2_password`身份验证插件
2. JDBC驱动需要检索服务器公钥来建立安全连接
3. 安全策略默认禁止公钥检索(Public Key Retrieval)
4. SSL连接未启用时可能导致握手失败
**完整配置示例**:
```java
String url = "jdbc:mysql://localhost:3306/your_database?"
+ "useUnicode=true&characterEncoding=utf8"
+ "&useSSL=false"
+ "&allowPublicKeyRetrieval=true"
+ "&serverTimezone=UTC";
```
**其他注意事项**:
1. 生产环境应使用SSL连接(将useSSL设置为true)
2. 需要确保MySQL用户密码正确
3. 检查MySQL服务是否允许远程连接
4. 驱动版本应与MySQL服务器版本匹配
阅读全文
相关推荐











