问题描述
最近在学习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参数,还是能够正常连接,难道数据库连接过一次之后会自动缓存相同连接的配置信息吗,不是很懂。有懂的大佬还请指教。