1. 程式人生 > >Jdbc連接MySQL 8時報錯“MySQLNonTransientConnectionException: Public Key Retrieval is not allowed”

Jdbc連接MySQL 8時報錯“MySQLNonTransientConnectionException: Public Key Retrieval is not allowed”

ont exc als 為什麽 pass 用戶 zone pub shang

一、問題

因停電檢修,今天重啟服務器後,再啟動jboss就報錯“MySQLNonTransientConnectionException: Public Key Retrieval is not allowed”,jboss無法獲取對數據源的JDBC連接。

二、解決過程

百度一下,先說是舊版JDBC驅動的bug,於是從maven中央庫下載最新的mysql-connector-8.0.11.jar,替換後修改jboss的modle說明、將配置文件中的driver-class改為‘com.mysql.cj.jdbc.Driver‘,但錯誤依舊。隨後發現8.0.11版與hibernate不匹配,又改回原來的5.1.46。

繼續百度,說是需修改default_authentication_plugin設置,於是修改my.ini,增加[mysqld] default_authentication_plugin=mysql_native_password,重啟mysql 8,錯誤依舊。

繼續百度,說是仍需修改用戶的密碼加密方式,於是在mysql命令行執行:ALTER USER ‘myuser‘@‘localhost‘ IDENTIFIED WITH mysql_native_password BY ‘mypassword‘;,這次雖仍報錯,但錯誤提示變成“InvalidConnectionAttributeException: The server time zone value ‘<亂碼>‘ is unrecognized or represents more than one time zone. ……”。

繼續百度,說是在jdbc連接串需指定time zone,於是修改jboss配置文件中的connection-url,在最後增加serverTimezone=Asia/Shanghai,重啟jboss,終於過關。

三、總結

  • 更換mysql的jdbc驅動,但其實從 5.1.37已經更新過這個bug,一般不需要;
  • 修改my.ini(Linux則是my.cnf),增加[mysqld] default_authentication_plugin=mysql_native_password;
  • 在mysql命令行執行:ALTER USER ‘myuser‘@‘localhost‘ IDENTIFIED WITH mysql_native_password BY ‘mypassword‘;
  • 在jdbc連接串指定time zone。

四、疑問

問題雖然解決了,但仍存在幾個疑問:

  • 為什麽停電重啟前一切正常?
  • 為避免SSL,配置文件中的connection-url中加了useSSL=false,難道與這有關系?

Jdbc連接MySQL 8時報錯“MySQLNonTransientConnectionException: Public Key Retrieval is not allowed”