MySQL服务未运行是Java应用连接失败的主因;需验证服务状态、添加8.3.0版mysql-connector-j驱动、配置含时区和SSL参数的JDBC URL,并通过SELECT 1测试真实连通性。
很多 Java 应用启动时报 Communications link failure 或 Connection refused,根本原因不是代码写错,而是本地根本没跑起来 MySQL。先验证服务状态:
MySQL80(或类似名称),确保状态为“正在运行”;也可在命令行执行 sc query MySQL80
brew services list | grep mysql(Homebrew 安装)或 sudo systemctl status mysql
mysql -u root -p,能成功登录即说明服务就绪Java 连 MySQL 必须通过 JDBC 驱动,版本不匹配会导致 ClassNotFoundException 或连接后无法执行某些 SQL(如 JSON 字段操作)。推荐使用官方最新稳定版:
mysql mysql-connector-j8.3.0
注意:mysql-connector-java 已在 8.0.33 后废弃,新项目必须用 mysql-connector-j;若用旧版驱动连 MySQL 8+,可能因默认启用 caching_sha2_password 认证而报 Public Key Retrieval is not allowed 错误。
URL 格式不对是连接失败最常见原因。MySQL 8+ 默认要求显式指定时区和服务器证书策略:
jdbc:mysql://localhost:3306/your_db?serverTimezone=Asia/Shanghai&useSSL=false
Unknown system variable 'query_cache_size',说明驱动试图兼容老版本协议,加 &allowPublicKeyRetrieval=true
&useSSL=true&requireSSL=true,并配置信任库autoReconnect=true —— 现代驱动已弃用该参数,应靠连接池自身的健康检查机制处理断连只调用 DriverManager.getConnection(...) 成功不代表数据库就 ready。常见陷阱是连接建立但无法执行查询,比如权限不足或表不存在:
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt 
= conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 1")) {
if (rs.next()) {
System.out.println("✅ 数据库连接与基础查询正常");
}
} catch (SQLException e) {
System.err.println("❌ 连接失败:" + e.getMessage());
}
务必加上实际查询(哪怕只是 SELECT 1),否则会掩盖 Access denied for user 或 No database selected 类错误。另外,Connection 对象创建后不自动校验连通性,JDBC 驱动直到第一次执行语句才真正发包到服务端。
本地开发时最容易被忽略的是 MySQL 的 bind-address 配置 —— 如果 my.cnf 里写了 bind-address = 127.0.0.1,那 localhost 走 socket 连接没问题,但换成 127.0.0.1 就可能因 DNS 解析或权限规则差异失败。