Java应用连接CentOS7上的MySQL报Communications link failure错误求解决
可能的原因及排查方案
- JDBC URL隐藏格式错误
你当前粘贴的配置中JDBC URL未显式指定3306端口,虽然MySQL驱动默认会用3306,但建议先手动补充端口为jdbc:mysql://xxx.xx.xxx.xxx:3306/mydbname?xxx。另外注意检查IP地址前后是否存在复制粘贴带入的不可见字符(比如零宽空格、换行、多余空格),建议手动删除IP段重新手打输入,避免隐藏字符导致解析失败。 - 配置加载优先级问题
确认SpringBoot启动时实际加载的配置是否为你修改的application.properties:如果项目存在多环境配置(application-dev.properties、application-prod.properties)、配置中心、启动参数覆盖、操作系统环境变量注入数据源配置的情况,会导致你修改的本地配置不生效。可以在应用启动类中添加代码打印实际加载的spring.datasource.url值,确认运行时的IP配置是否正确。 - JVM网络代理配置问题
Workbench和shell走的是系统级网络配置,而Java进程可能单独配置了JVM级别的代理,导致网络请求被代理转发后无法识别对应IP。可以查看Java应用的启动参数是否包含-Dhttp.proxyHost、-Dhttp.proxyPort、-DsocksProxyHost这类代理配置,如有需要调整代理规则,排除MySQL服务器IP的代理转发。 - JDBC驱动版本兼容性问题
你当前使用的com.mysql.cj.jdbc.Driver是MySQL 8.0+版本的驱动,如果你的MySQL服务端版本为5.6/5.7,可以尝试降低驱动版本到5.1.x系列,同时将驱动类改为com.mysql.jdbc.Driver,避免高版本驱动的解析bug。 - 最简测试排除框架影响
可以写独立的JDBC测试类直接连接数据库,排除SpringBoot配置的干扰:
如果该测试类可以正常连接,说明问题出在SpringBoot的配置加载链路,否则可以确认是Java运行环境的网络问题。import java.sql.Connection; import java.sql.DriverManager; public class MysqlConnectTest { public static void main(String[] args) { // 此处替换为你实际的连接信息 String url = "jdbc:mysql://xxx.xx.xxx.xxx:3306/mydbname?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Warsaw"; String username = "mylogin"; String password = "mypassword"; try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection(url, username, password); System.out.println("连接成功"); connection.close(); } catch (Exception e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者spazzola
相关产品推荐
相关产品推荐

