dan*_*nny 71 java mysql exception connector
我尝试使用连接器8.0.11将MySql数据库与Java连接.一切似乎都没问题,但我有这个例外:
线程"main"中的异常java.sql.SQLNonTransientConnectionException:不允许公钥检索
堆栈跟踪:
Exception in thread "main" java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at
com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:438) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:146) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:119) at ConnectionManager.getConnection(ConnectionManager.java:28) at Main.main(Main.java:8)
Run Code Online (Sandbox Code Playgroud)
Connector Manager:
public class ConnectionManager {
public static final String serverTimeZone = "UTC";
public static final String serverName = "localhost";
public static final String databaseName ="biblioteka";
public static final int portNumber = 3306;
public static final String user = "anyroot";
public static final String password = "anyroot";
public static Connection getConnection() throws SQLException {
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUseSSL( false );
dataSource.setServerTimezone( serverTimeZone );
dataSource.setServerName( serverName );
dataSource.setDatabaseName( databaseName );
dataSource.setPortNumber( portNumber );
dataSource.setUser( user );
dataSource.setPassword( password );
return dataSource.getConnection();
}
}
Run Code Online (Sandbox Code Playgroud)
jto*_*szk 144
您应该将客户机选项添加到您的mysql连接器 allowPublicKeyRetrieval=true
https://mysql-net.github.io/MySqlConnector/connection-options/
也可以帮助添加 useSSL=false
Jav*_*les 130
对于DBeaver用户:
右键单击您的连接,选择“编辑连接”
在“连接设置”屏幕(主屏幕)上单击“编辑驱动程序设置”
点击“连接属性”
右键单击“用户属性”区域并选择“添加新属性”
添加两个属性:“useSSL”和“allowPublicKeyRetrieval”
通过双击“值”列将它们的值设置为“假”和“真”
mic*_*alk 33
从DBeaver执行此操作时,我必须转到“连接设置”->“SSL”选项卡,然后:
请注意,这仅适用于本地开发。
sus*_*097 19
使用 jdbc url如:
jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;
Run Code Online (Sandbox Code Playgroud)
PortNo: 3306 您的配置可能有所不同
spring.datasource.url=jdbc:mysql://localhost:3306/database?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false
Run Code Online (Sandbox Code Playgroud)
您可以将此行插入到 applications.properties 文件中,这意味着,
spring.datasource.url=jdbc:mysql://localhost:3306/这个使用mysql作为数据库服务。我认为这可以通过使用相关名称和数据库名称的端口来更改。database?createDatabaseIfNotExist=true= 使用名为database 的数据库,如果您还没有创建这样的数据库,请创建一个新数据库。allowPublicKeyRetrieval=true= 允许客户端自动向服务器请求公钥。(这部分可能是额外的)useSSL=false= 这将禁用 SSL 并抑制 SSL 错误此外,请警惕spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect同一文件中的属性。
最后检查您是否在 pom.xml 文件的依赖项中添加了以下依赖项。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
小智 8
首先,请确保您的数据库服务器已启动并正在运行。我遇到了同样的错误,在尝试了此处列出的所有答案后,我发现我的数据库服务器没有运行。
您可以从 MySQL Workbench 或命令行使用检查相同的内容
mysql -u USERNAME -p
Run Code Online (Sandbox Code Playgroud)
这听起来很明显,但很多时候我们假设数据库服务器一直在启动并运行,特别是当我们在本地计算机上工作时,当我们重新启动/关闭计算机时,数据库服务器将自动关闭。
除了建议的答案,您还可以尝试使用mysql_native_password身份验证插件代替caching_sha2_password身份验证插件。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here';
Run Code Online (Sandbox Code Playgroud)
由于用户名或密码错误也可能发生这种情况。作为解决方案,我添加了 allowPublicKeyRetrieval=true&useSSL=false部分,但仍然出现错误,然后我检查了密码,结果是错误的。
我在 spring boot 框架上使用以下配置解决了这个问题
spring.datasource.url=jdbc:mysql://localhost:3306/db-name?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
Run Code Online (Sandbox Code Playgroud)
在 MySQL 8.0 中,默认身份验证插件从 mysql_native_password 更改为 caching_sha2_password。有关此更改的更多信息,请参阅https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password 。
这意味着为了使用 caching_sha2_password,连接必须执行以下操作之一:
您有几个选择: