异常信息
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
Communication link failure, message from server: "Can't get hostname for your address"
核心原因矩阵
| 原因类别 | 典型现象 | 排查命令/配置 |
| 网络不通 | ping/telnet 3306 失败 | telnet db_host 3306、检查防火墙/安全组 |
| MySQL 绑定地址 | 仅监听 127.0.0.1 | bind-address = 0.0.0.0 在 my.cnf/[mysqld] |
| 用户主机限制 | 用户仅允许 localhost | CREATE USER 'user'@'%' IDENTIFIED BY 'pass'; GRANT ALL ON db.* TO 'user'@'%'; |
| DNS 反向解析 | 报错含 "Can't get hostname" | skip-name-resolve 在 my.cnf/[mysqld] 或修复 DNS |
| 驱动版本不匹配 | MySQL 8.0 用 5.x 驱动 | 升级 mysql-connector-java 至 8.0.28+ |
| SSL/TLS 握手失败 | MySQL 5.7+ 默认要求 SSL | URL 添加 ?useSSL=false 或配置证书 |
标准连接模板
// JDBC URL 标准格式
jdbc:mysql://host:3306/database?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
// 完整连接代码
String url = "jdbc:mysql://192.168.1.100:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai";
String user = "app_user";
String password = "secure_pass";
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+ 驱动类
Connection conn = DriverManager.getConnection(url, user, password);
Eclipse 专项配置
- Data Source Explorer:右键 Database Connections → New → MySQL → 填入上述参数
- 项目构建路径:确保
mysql-connector-java-x.x.xx.jar 在 Libraries 中
- Tomcat 部署:若用连接池,检查
context.xml Resource 配置
快速验证步骤
# 1. 服务器端测试本地连接
mysql -u root -p -h 127.0.0.1
# 2. 客户端测试网络连通性
telnet server_ip 3306
# 3. 检查 MySQL 错误日志
tail -f /var/log/mysql/error.log