You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Spring无法获取JDBC连接问题求助(MySQL8.0+低版本驱动)

解决MySQL 8.0与旧版mysql-connector-java的连接问题

这个问题我之前帮同行排查过,核心就是mysql-connector-java 5.1.48和MySQL 8.0的版本兼容性冲突。MySQL 8.0做了不少底层变更:比如默认认证插件从mysql_native_password改成了caching_sha2_password,还调整了字符集相关的内部逻辑,而5.x系列的驱动对这些新特性支持不全,才会出现getServerCharset处的空指针异常,同时伴随SSL连接警告。

下面给你两个可行的解决方案,优先推荐第一个:

方案1:升级mysql-connector-java到兼容版本

这是最稳妥的长期解决方案,直接升级到适配MySQL 8.0的驱动版本,比如8.0.33(和MySQL 8.0的版本匹配度极佳)。

  • 如果用Maven管理依赖,修改pom.xml中的驱动依赖:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>
  • 升级后注意两个关键调整:
    1. JDBC驱动类名变了,从com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver,需要在配置文件中明确指定(比如application.properties):
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    1. 连接字符串需要补充时区参数(MySQL 8.0强制要求),同时添加参数消除SSL警告、解决新认证插件的连接问题,修改后的连接字符串:
    jdbc:mysql://localhost:3306/DBNAME?user=USERNAME&password=PASSWORD&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    

方案2:修改MySQL 8.0的用户认证插件(临时 workaround)

如果暂时不想升级驱动,可以把目标用户的认证方式改回旧版的mysql_native_password

  1. 打开MySQL控制台,用管理员账号登录:
mysql -u root -p
  1. 执行SQL修改用户认证方式:
ALTER USER 'USERNAME'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
FLUSH PRIVILEGES;
  1. 最后调整连接字符串,添加useSSL=false消除警告:
jdbc:mysql://localhost:3306/DBNAME?user=USERNAME&password=PASSWORD&useSSL=false

⚠️ 注意:这个方案只是临时过渡用的,未来MySQL可能会逐步淘汰mysql_native_password插件,长期来看还是升级驱动更靠谱。

内容的提问来源于stack exchange,提问作者springandangular

火山引擎 最新活动