zoukankan      html  css  js  c++  java
  • 关于JDBC连接数据库时出现的Public Key Retrieval is not allowed错误

    问题描述

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

    解决过程

       通过一通百度,收集了可能导致这个问题的原因如下:

        1.mysql5及之前的版本使用的是旧版驱动"com.mysql.jdbc.Driver",mysql6以及之后的版本需要更新到新版驱动,对应的Driver是"com.mysql.cj.jdbc.Driver",但是这个驱动错误的信息是"Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.",排除这个原因。

        2.连接数据库的url中,加上allowPublicKeyRetrieval=true参数,经过验证解决该问题。

        3.网上看到另外的解决 办法,修改default_authentication_plugin设置,在my.ini中增加[mysqld]default_authentication_plugin=mysql_native_password,然后mysql命令行执行ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';最后在url中添加时区参数serverTimezone=Asia/Shanghai。

    总结

        我用的第二种方法解决了,网上说的第三种方法是在数据库重启后遇到的,问题的原因也不甚清楚。不知道是不是mysql8才会遇到的一些坑。我在使用第二种方法连接成功一次后,再去掉allowPublicKeyRetrieval=true参数,还是能够正常连接,难道数据库连接过一次之后会自动缓存相同连接的配置信息吗,不是很懂。有懂的大佬还请指教。

  • 相关阅读:
    数据结构_队列和滑动窗口
    数据结构_栈和单调栈
    数据结构_链表及邻接表
    JavaSE多线程
    AppExtension总结
    FlutterBloc 2.1.1迁移至6.0.6
    iOS通知总结
    Provider 4.3.2+2 f
    Fish-Redux 研究
    王道考研复习-操作系统-内存管理(三)
  • 原文地址:https://www.cnblogs.com/jpfss/p/9745603.html
Copyright © 2011-2022 走看看