我尝试使用连接器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)
连接器管理器:
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();
}
}
答案 0 :(得分:98)
您应该将客户端选项添加到mysql-connector free(sum_result);
https://mysql-net.github.io/MySqlConnector/connection-options/
还有助于添加allowPublicKeyRetrieval=true
答案 1 :(得分:48)
对于 DBeaver 用户:
右键单击您的连接,选择“编辑连接”
在“连接设置”屏幕(主屏幕)上,单击“编辑驱动程序设置”
单击“连接属性”
右键单击“用户属性”区域,然后选择“添加新属性”
添加两个属性:“ useSSL”和“ allowPublicKeyRetrieval”
通过双击“值”列将其值分别设置为“假”和“真”
答案 2 :(得分:11)
将jdbc url
用作:
jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;
PortNo: 3306
的配置可能不同
答案 3 :(得分:4)
替代建议的答案,您可以尝试使用 mysql_native_password 身份验证插件代替 caching_sha2_password 身份验证插件。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here';
答案 4 :(得分:2)
我在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
答案 5 :(得分:2)
这也可能由于用户名或密码错误而发生。
作为解决方案,我添加了allowPublicKeyRetrieval=true&useSSL=false
部分,但仍然出现错误,然后我检查了密码,这是错误的。
答案 6 :(得分:1)
就我而言,这是用户错误。我使用的// The red circle is the figure to drop into a raft
var circle = new draw2d.shape.basic.Circle({radius: 40, x: 50, y: 150});
// The blue rectangle is a simple raft
var raft = new draw2d.shape.composite.Raft({width: 200, height: 150, x: 250, y: 20, bgColor:"#0074d9"});
// The orange rectangle is an embedded raft in a FlexGridLayout
var flexLayout = new draw2d.shape.layout.FlexGridLayout({width: 200, height: 200, x: 250, y: 250, stroke: 1, columns: "grow", rows: "5px, grow"});
var label = new draw2d.shape.basic.Label({text: "a label", resizeable: true});
var embeddedRaft = new draw2d.shape.composite.Raft({width: 200, height: 150, x: 250, y: 150, bgColor:"#FF851B"});
flexLayout.add(label, {row: 0, col: 0});
flexLayout.add(embeddedRaft, {row: 1, col: 0});
用户使用了无效的密码。我不确定为什么我没有收到验证错误,而是收到了这个隐秘的消息。
答案 7 :(得分:1)
首先,请确保您的数据库服务器已启动并正在运行。 在尝试了此处列出的所有答案之后,我遇到了同样的错误,我发现我的数据库服务器未运行。
您可以使用
从MySQL Workbench或命令行中进行检查。using DevExpress.XtraReports.UI;
using System;
using System.Collections.Generic;
namespace TestRepo.ReportsDesign
{
public class ReportFactory
{
static ReportFactory()
{
Report.Add("Zaposleni 1", () => new ZaposleniSaoOsig1());
Report.Add("Zaposleni 2", () => new ZaposleniSaoOsig2());
Report.Add("Zaposleni 3", () => new ZaposleniSaoOsig3());
}
public static Dictionary<string, Func<XtraReport>> Report = new Dictionary<string, Func<XtraReport>>();
}
}
这听起来很明显,但是很多时候我们都假设数据库服务器一直处于运行状态,尤其是当我们在本地计算机上工作时,当我们重新启动/关闭计算机时,数据库服务器将自动关闭。 >
答案 8 :(得分:1)
在对我们现有的应用程序进行泊坞窗处理时,我也遇到了这样的问题。该解决方案可以在JDBC连接字符串中添加值为 true 的MySQL的 allowPublicKeyRetrieval 连接选项。 如果这不起作用,请尝试向 false 中添加 useSSL 选项。
结果字符串如下所示:
jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false
答案 9 :(得分:0)
我的问题出在 pom.xml
(spring boot)。
我的 pom.xml 有两个不同数据库的依赖项。确保仅保留 MySQL 依赖项并删除任何其他数据库依赖项。
答案 10 :(得分:0)
答案 11 :(得分:0)
答案 12 :(得分:0)
在与MySQL的Spring Boot应用程序连接中更新useSSL = true;
jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC
答案 13 :(得分:0)
如果在连接mysql(运行mysql的本地或mysql容器)时遇到以下错误:
java.sql.SQLNonTransientConnectionException:不允许公共密钥检索
解决方案: 在数据库服务中添加以下行:
command: --default-authentication-plugin=mysql_native_password
答案 14 :(得分:0)
将连接网址设置为 jdbc:mysql:// localhost:3306 / hb_student_tracker?allowPublicKeyRetrieval = true&useSSL = false&serverTimezone = UTC
答案 15 :(得分:0)
我发现这个问题令人沮丧,因为昨天我可以与数据库进行交互,但是今天早上回来后,我开始收到此错误。
我尝试添加allowPublicKeyRetrieval=true
标志,但一直出现错误。
对我来说,解决此问题的方法是在Eclipse中执行Project->Clean
,在Tomcat服务器上执行Clean
。其中一个(或两个)修复了它。
我不明白为什么,因为我使用Maven构建项目,并且每次更改代码后都重新启动服务器。很烦人...
答案 16 :(得分:0)
在我看来,上述错误实际上是由于用户名和密码错误造成的。 解决问题: 1.转到行DriverManager.getConnection(“ jdbc:mysql:// localhost:3306 /?useSSL = false”,“用户名”,“密码”); 用户名和密码字段可能错误。输入用于启动mysql客户端的用户名和密码。用户名通常为root,密码为当出现类似Startup screen of mysql
的屏幕时输入的字符串。注意:您的端口名3306可能不同。
答案 17 :(得分:0)
此解决方案适用于MacOS Sierra,并运行MySQL 8.0.11版。请确保已在构建路径中添加了驱动程序-“添加外部jar”应与SQL版本匹配。
String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";