コネクタ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();
}
}
Mysql-connectorにクライアントオプションを追加する必要がありますallowPublicKeyRetrieval=true
https://mysql-net.github.io/MySqlConnector/connection-options/
useSSL=false
の追加にも役立ちます
jdbc url
を次のように使用します。
jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;
PortNo: 3306
は構成によって異なる場合があります
推奨される回答の代わりに、caching_sha2_password認証プラグインの代わりにmysql_native_password認証プラグインを使用して試すこともできます。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here';
私はスプリングブートフレームワークで以下の構成を使用してこの問題を解決します
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
私の場合、上記のエラーは実際にはユーザー名とパスワードが間違っていたためです。問題の解決:1.行DriverManager.getConnection( "jdbc:mysql:// localhost:3306 /?useSSL = false"、 "username"、 "password");に移動します。ユーザー名とパスワードのフィールドが間違っている可能性があります。 mysqlクライアントの起動に使用するユーザー名とパスワードを入力します。ユーザー名は通常ルートで、パスワードはこれに似た画面が表示されたときに入力する文字列です mysqlの起動画面
注:ポート名3306は、ケースによって異なる場合があります。
私の場合、それはユーザーエラーでした。無効なパスワードを持つroot
ユーザーを使用していました。なぜ認証エラーを受け取らなかったのかはわかりませんが、代わりにこの不可解なメッセージを受け取りました。
このソリューションはMacOS Sierraで機能し、MySQLバージョン8.0.11を実行しています。ビルドパスに追加したドライバーを確認してください-「外部jarの追加」はSQLバージョンと一致する必要があります。
String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
接続URLをjdbc:mysql:// localhost:3306/hb_student_tracker?allowPublicKeyRetrieval = true&useSSL = false&serverTimezone = UTCとして指定します
昨日データベースとやり取りすることができたため、この問題にイライラしていましたが、今朝戻った後、このエラーが発生し始めました。
allowPublicKeyRetrieval=true
フラグを追加しようとしましたが、エラーが発生し続けました。
私にとってそれを修正したのは、Project->Clean
をEclipseで、Clean
をTomcatサーバーで実行することでした。それらの1つ(または両方)が修正しました。
Mavenを使用してプロジェクトをビルドし、コードを変更するたびにサーバーを再起動しているため、理由がわかりません。とても刺激的...
Mysql(mysqlを実行しているローカルまたはmysqlコンテナ)の接続中に次のエラーが発生した場合:
Java.sql.SQLNonTransientConnectionException:公開キーの取得は許可されていません
解決策:データベースサービスに次の行を追加します。
command: --default-authentication-plugin=mysql_native_password