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>
- 升级后注意两个关键调整:
- JDBC驱动类名变了,从
com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver,需要在配置文件中明确指定(比如application.properties):
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver- 连接字符串需要补充时区参数(MySQL 8.0强制要求),同时添加参数消除SSL警告、解决新认证插件的连接问题,修改后的连接字符串:
jdbc:mysql://localhost:3306/DBNAME?user=USERNAME&password=PASSWORD&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true - JDBC驱动类名变了,从
方案2:修改MySQL 8.0的用户认证插件(临时 workaround)
如果暂时不想升级驱动,可以把目标用户的认证方式改回旧版的mysql_native_password:
- 打开MySQL控制台,用管理员账号登录:
mysql -u root -p
- 执行SQL修改用户认证方式:
ALTER USER 'USERNAME'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD'; FLUSH PRIVILEGES;
- 最后调整连接字符串,添加
useSSL=false消除警告:
jdbc:mysql://localhost:3306/DBNAME?user=USERNAME&password=PASSWORD&useSSL=false
⚠️ 注意:这个方案只是临时过渡用的,未来MySQL可能会逐步淘汰mysql_native_password插件,长期来看还是升级驱动更靠谱。
内容的提问来源于stack exchange,提问作者springandangular




