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


一、問題

因停電檢修,今天重啟服務器后,再啟動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,難道與這有關系?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM