com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed
时间: 2023-11-12 22:57:23 浏览: 231
这个异常通常是由于 MySQL 8.0 版本以上的 JDBC 驱动程序默认启用了 SSL/TLS 加密连接,但是在某些情况下,MySQL 服务器可能无法提供必要的证书或者 SSL/TLS 加密连接被禁用。为了解决这个问题,可以尝试以下两种方法:
1. 在 JDBC URL 中添加参数 `&allowPublicKeyRetrieval=true`,例如:
```
jdbc:mysql://localhost:3306/mydatabase?useSSL=false&allowPublicKeyRetrieval=true
```
2. 在 MySQL 服务器上启用 SSL/TLS 加密连接,具体方法可以参考 MySQL 官方文档。
相关问题
Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed
这个错误通常是由于 MySQL 8.0 版本引入了更严格的安全策略所致,其中默认情况下禁用了使用旧的加密方法。这可能会导致某些 JDBC 驱动程序无法建立安全连接,因此您需要更新您的 JDBC 驱动程序并使用新的安全连接选项。
您可以从 MySQL 官方网站下载 MySQL Connector/J 驱动程序的最新版本,并将其替换为旧版本的驱动程序。如果您使用的是 Maven,可以更新您的 pom.xml 文件以使用最新版本的 Connector/J。
另外,您还可以在 JDBC 连接字符串中添加 `allowPublicKeyRetrieval=true` 选项来启用允许公钥检索的连接。例如:
```
jdbc:mysql://localhost:3306/mydatabase?allowPublicKeyRetrieval=true
```
这将允许使用旧的加密方法建立安全连接,但请注意这可能会降低安全性。
希望这些方法能帮助您解决问题。
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary. 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 mysql/user/mappers/usermapper.xml ### The error may involve mysql.user.mappers.usermapper.selectAll ### The error occurred while executing a query ### Cause: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80) at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85) at com.sun.proxy.$Proxy4.selectAll(Unknown Source) at org.example.main2.main(main2.java:25) 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.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:829) at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:449) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:242) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) at java.sql.DriverManager.getConnection(Driv
这个问题是因为你正在使用过时的MySQL驱动程序。新的驱动程序类是`com.mysql.cj.jdbc.Driver`。新的驱动程序类会自动通过SPI进行注册,不需要手动加载驱动程序类。此外,你遇到的错误是“Public Key Retrieval is not allowed”,这可能是由于MySQL连接配置的问题引起的。你可以尝试在连接URL中添加`allowPublicKeyRetrieval=true`来解决此问题。例如:
```java
String url = "jdbc:mysql://localhost:3306/database?allowPublicKeyRetrieval=true";
```
请确保将`localhost:3306`替换为您的MySQL服务器主机和端口,`database`替换为您要连接的数据库名称。
阅读全文