MySQL 8.0版本驱动在JDBC的几个坑

前段时间在学习MySQL,我看的教程里用的是5.5的版本,但本人比较喜欢作死用新版,就去官网下了8.0.13的最新版(其实现在已经是8.0.15了),同时也配上了最新版的驱动。然后发现了不少奇奇怪怪的问题,目前大致就是下面几个,碰到新问题会继续补充。

驱动类名称

旧版驱动类是com.mysql.jdbc.Driver,但是如果你在8.0还继续用这个类,就会提示你:

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.

所以我们需要用新的驱动类,在配置文件中改为:

driver=com.mysql.cj.jdbc.Driver

时区

现在我们虽然填对了驱动类,但是又有一个新的报错:

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

这里就需要我们手动指定时区,如果你的服务器也是东八区(GMT+8),那么在URL后面加上参数serverTimezone=GMT%2B8即可:

url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8

SSL

之后还有一个在关闭连接对象时会产生的一个无关紧要的报错,不解决也可以正常使用,但是占据控制台的大量篇幅,导致使用体验极差:

javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify

MySQL 8.0开始,数据库URL需要设置是否使用SSL安全连接,在URL后面加上参数useSSL=false即可,多个参数键值对中间用&隔开:

url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false

Public Key Retrieval报错

重启服务器后悔出现Public Key Retrieval报错:

java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

在URL后加上allowPublicKeyRetrieval=true即可

url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true

getTables默认返回所有库的表

8.0及以上版本的驱动默认将nullCatalogMeansCurrent的默认值由true改为了false,如果使用DatabaseMetaData类的对象调用getTables方法,就会返回所有库的表,而非在url参数中指定的数据库(本例中数据库名为test)。此时就需要手动在参数中指定nullCatalogMeansCurrent值为true:

url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true

《MySQL 8.0版本驱动在JDBC的几个坑》上有3条评论

  1. 你好,那个javax.net.ssl.SSLException 的 问题,如果使用useSSL=false禁用了ssl,会产生安全问题么?如果想使用ssl就只能设置为true或者默认并忍受控制台多余的报错是么,我在网上找到的方法大多都是设置为false。我使用的jdk11和mysql 8.0.16。
    官网说到这个问题在8.0.16中已经被解决了,但我的环境还是有这个问题。
    https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-16.html

    1. 问题解决了 确实8.0.16中已经被解决 但我的maven引入的mysql的jar包还是8.0.15

      1. 不好意思这几天有点忙没看博客,之前我也是一直为这个多余的报错发愁把SSL关了,这个bug已经在8.0.16解决那看来我又可以去用SSL了

realSD进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注