无论是通过JDBC程序,还是DataGrip客户端连接MySQL(很简单的配置用户名、密码、URL等信息),但,总是会遇到各种奇奇怪怪的问题。本文故此而生。
在使用DataGrip时,如果遇到奇奇怪怪的连接失败问题,不妨试试清除缓存重启,尤其是在连接若干个数据源,反复切换驱动版本后
注:本文使用的DataGrip版本为:
DataGrip 2021.1.2
Build #DB-211.7442.38, built on May 31, 2021
JDBC程序报错信息如下:
Caused by: java.lang.ArrayIndexOutOfBoundsException: 24
at com.mysql.cj.mysqla.io.Buffer.readLong(Buffer.java:284) ~[mysql-connector-java-6.0.2.jar:6.0.2]
后面的具体信息就省略掉;
经过分析,查找资料,定位原因是我本地安装的MySQL的版本是5.6,然后我在 pom.xml 文件里面配置 mysql-connector-java 的版本,如上所示 6.0.2。结果就报这种错误信息。如果把思维惯性放在数组越界,可能怎么都解决不了问题吧。
DataGrip版本号为2021.1.2,待连接的数据源版本为8.0.18
,使用的驱动版本为5.1.42
,报错信息如下:
[2022-03-07 16:09:05] javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate).
解决方案:
8.0.20
参考解决方案DataGrip-upgraded-to-2021-1-2-error-occurs-when-connecting-to-database-SSLHandshakeException
如图,DataGrip使用8.0.20
版本的驱动。
连接一个数据源报错:
[08001] CLIENT_PLUGIN_AUTH is required
com.mysql.cj.exceptions.UnableToConnectException: CLIENT_PLUGIN_AUTH is required.
降低MySQL驱动版本,比如降到5.1.42
版本可以连接成功。因为被连接的数据源版本太低:
DBMS: MySQL (ver. 5.0.95)
使用的DataGrip版本号为2021.1.2,报错信息如下:
[S1009] java.lang.ClassCastException: class java.math.BigInteger cannot be cast to class java.lang.Long (java.math.BigInteger and java.lang.Long are in module java.base of loader 'bootstrap')
class java.math.BigInteger cannot be cast to class java.lang.Long (java.math.BigInteger and java.lang.Long are in module java.base of loader 'bootstrap').
问题根源:使用的mysql-connector-java.jar
驱动jar包过于老旧。
我使用的版本号为mysql-connector-java-5.1.24.jar
,换成mysql-connector-java-5.1.46.jar
问题解决。当然直接使用mysql-connector-java-8.0.20.jar
,8.*
版本,也能解决问题。
使用DataGrip 2021.1.2 + mysql-connector-java-5.1.42.jar
驱动,连接MySQL数据源失败,报错信息:[HY000][1193] Unknown system variable 'query_cache_size'.
因为待连接的数据源的版本较高:
DBMS: MySQL (ver. 8.0.22-13)
Case sensitivity: plain=lower, delimited=lower
Driver: MySQL Connector/J (ver. mysql-connector-java-8.0.20 (Revision: afc0a13cd3c5a0bf57eaa809ee0ee6df1fd5ac9b), JDBC4.2)
而驱动版本太低。
解决方案:
将驱动升级到版本8,比如mysql-connector-java-8.0.20.jar
,即可。