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‘,但错误依旧。

继续百度,说是需修改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,不一定非要用8.0.11;
  • 修改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,难道与这有关系?

原文地址:https://www.cnblogs.com/wggj/p/9001899.html

时间: 2024-10-11 15:48:56

Jdbc连接MySQL 8时报错“MySQLNonTransientConnectionException: Public Key Retrieval is not allowed”的相关文章

MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法

在跟着视频练习时,又遇到一个问题,解决方案如下: 在使用 MySQL 8.0 时重启应用后提示 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed 最简单的解决方法是在连接后面添加 allowPublicKeyRetrieval=true 文档中(https://mysql-net.github.io/MySqlConnector/con

关于JDBC连接数据库时出现的Public Key Retrieval is not allowed错误

问题描述 最近在学习MyBatis框架,参考官方的文档通过配置文件的方式已经实现了通过Configuration配置文件和mapper映射文件访问mysql8数据库,于是想试试不使用XML文件去构建SqlSessionFactory,结合配置文件和官方文档,依次构建了DataSource,JdbcTransactionFactory,Configuration等等,并添加Mapper,在Mapper接口中通过注解配置了SQL语句,一步步的构建完成,前面都顺利执行没有抛出异常,当通过SqlSess

【已解决】使用Navicat连接MySQL数据库时报错Client does not support authentication protocol requested by server; consider upgrading MySQL client

报错缘由: 起初在验证一个mybatis的demo时提示"Error querying database"(见下方完整代码),找了很多方法没有解决,最后在贴吧找到答案.错误原因是安装mysql时Authentication Method选择了第一种强加密方法,改成第二种问题就解决了. 解决方法: 打开mysql安装程序(或者重装,但是重装很麻烦),重新配置MySQL Server 配置Authentication Method这一步时,选择第二种加密方法,重新打开Navicat,问题解

JDBC 连接 MySQL 时碰到的小坑

最近从MS SQL Server换到了MySQL,已经是8.11版本了,安装的时候似乎还用了新的身份认证方式之类的,连接过程中也是磕磕绊绊,碰到很多奇奇怪怪的问题,在此记录下来. 驱动加载: 以前使用JDBC时,都是导入相应的JDBC驱动jar包,然后使用 Class.forName(driverName); 加载驱动,再进行数据库连接,在使用MySQL 8.11版本及其对应的Connector时,如果使用上述代码加载com.mysql.jdbc.Driver的话,控制台会输出一行信息: Loa

jdbc连接mysql报错:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column &#39;&#233;?‘&#229;?‰&#230;—&#173;&#39; in &#39;field list&#39;

解决了中文显示乱码问题之后,又出现了这么一个问题, 思考一下,这绝对是输入文本的问题. 试了一下,果然不出所料. 再次怀疑编码,没有办法, 只有很无奈地去百度了,结果是与编码没有问题啊. sql.execute("insert into reader values('"+rn+"','"+pid+"','"+tele+"','"+kno+"')"); 原来报错是因为我没写单引号,mysql当然不认识啊.OK

java jdbc 连接mysql数据库 实现增删改查

好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一訪问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发者提供了一个标准的API,据此能够构建更高级的工具和接口,使数据库开发者能够用纯 Java API 编写数据库应用程序,而且可跨平台执行,而且不受数据库供应商的限制.

JAVA使用JDBC连接MySQL数据库 二(2)

本文是对 <JAVA使用JDBC连接MySQL数据库 二>的改进. 上节使用的是PreparedStatement来执行数据库语句,但是preparedStatement需要传递一个sql语句参数,才能创建.然而,DBHelper类只是起到打开和关闭数据库的作用,所以sql语句是要放到应用层部分的,而不是放到DBHelper类中. 而statment不需要传递一个sql语句参数,就能创建. 修改部分如下: public class DBHelper { String driver = &quo

使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询

转载请注明:http://blog.csdn.net/uniquewonderq 问题: 使用JDBC连接Mysql数据库,实现对Emp表数据的分页查询功能. 方案: 对于较大的数据量,通常采用分页查询的方式.不同的数据库产品有不同的数据库级的分页查询策略.例如:Oracle通常使用rownum的方式:而Mysql使用limit的方式. Oracle采用rownum和子查询实现分页查询,SQL语句如下, select * from (select rownum rn,empno,ename,jo