mysql-connector-java 8.x连接远程MySQL失败但5.x可用如何解决
问题解决方案
MySQL Connector/J 8.0版本和5.x版本默认配置差异较大,你当前的连接串缺少必要的兼容参数是最核心的故障原因,可按以下步骤排查修复:
1. 优先修改JDBC连接串,补充兼容参数
5.x版本驱动默认useSSL=false,也不需要显式指定时区,8.0+版本默认开启SSL校验,且强制要求时区匹配。你的服务器环境和本地环境的时区、JDK信任证书链存在差异,就会出现本地运行正常、服务器连接失败的问题,直接替换为带参数的连接串即可:
try { Class.forName("com.mysql.cj.jdbc.Driver"); // 替换原连接串,补充必要参数 return DriverManager.getConnection("jdbc:mysql://xxx.xxx.xxx.xxx:3306/dbname?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8", "username", "password"); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); }
参数说明:
useSSL=false:关闭SSL连接,和5.x驱动默认行为一致,如果你需要开启SSL连接再改回true,同时配置服务器JDK的SSL证书信任链allowPublicKeyRetrieval=true:允许客户端从服务器获取公钥,避免密码加密阶段连接中断serverTimezone:和你的MySQL服务器时区保持一致即可,国内服务器通常填Asia/Shanghai,海外服务器可填对应时区或UTC- 编码相关参数可根据你的业务实际需求调整
2. 额外环境排查(修改连接串后仍失败再操作)
- 检查服务器是否同时存在多个版本的
mysql-connector-java包,导致类加载冲突,只保留8.0.15版本的jar包即可 - 检查服务器JDK的
jre/lib/security/java.security配置,是否禁用了TLSv1.2协议,8.0驱动默认使用该协议连接,若被禁用可在连接串追加&enabledTLSProtocols=TLSv1.2强制指定 - 若你的MySQL服务器版本低于5.5,需要升级MySQL版本,8.0驱动最低仅兼容MySQL 5.5及以上版本
内容的提问来源于stack exchange,提问作者Mayank
相关产品推荐
相关产品推荐

