Ubuntu Java日志出现连接超时的定位与处理
一、先快速定位问题归属
- 看异常类型与关键词:
- java.net.ConnectException: Connection timed out / no further information:通常是网络层无法在限定时间内建立TCP连接,重点排查目标主机可达性、端口监听与防火墙。
- java.net.SocketTimeoutException: Read timed out:已建立连接,但在规定时间内未收到响应,重点排查服务端处理慢、网络延迟、读取超时设置过短。
- javax.net.ssl.SSLHandshakeException:SSL握手失败,检查证书信任链、协议与加密套件。
- Communications link failure / The last packet sent successfully to the server was 0 milliseconds ago:常见于数据库连接失败或中断,检查数据库服务、网络与JDBC配置。
- 用系统工具验证连通性(在应用宿主机上执行):
- 监听与端口占用:ss -tulnp | grep <端口> 或 lsof -i :<端口>。
- 端口可达:telnet <端口> 或 nc -zv <端口>。
- 主机可达与路由:ping 、traceroute 。
- DNS解析:nslookup <域名>、dig <域名>。
- 防火墙/安全组:Ubuntu 本地用 sudo ufw status 查看规则;云上需在安全组放行对应端口与来源IP。
二、常见根因与对应处理
- 目标服务未启动或崩溃:在目标机器确认服务进程与监听端口,必要时重启服务并查看服务日志。
- 端口配置错误:核对客户端连接URL/代码中的主机与端口是否与服务端监听一致。
- 防火墙/安全组拦截:在Ubuntu启用规则放行端口(如 sudo ufw allow <端口>/tcp),云环境同步在安全组放通。
- 网络延迟/丢包或路由异常:用 ping/traceroute 定位链路问题,必要时联系网络侧排障。
- DNS解析失败:用 nslookup/dig 校验,必要时改用IP或修正DNS。
- 服务器负载过高:用 top/htop 等查看CPU/内存/IO,优化慢查询或扩容。
- JDBC/数据库专项:
- 核对 JDBC URL、用户名、密码 与驱动版本;确保驱动在类路径。
- 连接池配置合理(如 HikariCP 的 connectionTimeout、maximumPoolSize),避免连接泄露与获取连接过慢。
- 数据库服务状态与连接数:如 sudo systemctl status mysql,必要时调大最大连接数并优化慢SQL。
三、代码与配置层面的修复建议
- 设置合理的超时(示例):
- 原生Socket:
- Socket socket = new Socket();
- socket.connect(new InetAddress(“host”, port), 5000); // 连接超时5秒
- socket.setSoTimeout(10000); // 读取超时10秒
- JDBC(以HikariCP为例,Spring Boot常见配置):
- spring.datasource.hikari.connection-timeout=5000
- spring.datasource.hikari.maximum-pool-size=20
- 增加有限重试(示例):
- 最大重试3次、间隔2秒;捕获异常后sleep再重试,避免雪崩。
- 资源与连接管理:
- 使用 try-with-resources 确保 Connection/Statement/ResultSet 或 Socket 及时关闭,防止泄露导致后续获取连接超时。
- 连接池最佳实践:
- 选择合适的池(如 HikariCP、Druid、Apache DBCP),设置合理的最小/最大连接数与验证查询,定期清理空闲/失效连接。
四、数据库场景的专项排查与修复
- 服务与监听:
- 确认数据库已启动(如 sudo systemctl status mysql),并监听正确端口(如 3306)。
- 本地回路与地址绑定:
- 若连接 localhost 异常,尝试改用 127.0.0.1 排除IPv6/套接字配置影响。
- 连接稳定性参数(按需):
- 适当增大 wait_timeout / interactive_timeout,减少空闲被回收导致的“突然断开”。
- 连接数/负载/慢查询:
- 查看当前连接与慢查询,优化SQL、加索引或扩容,避免新连接建立被阻塞或超时。
五、高效排查命令清单与排错顺序
- 命令清单(在应用宿主机执行):
- 监听与占用:ss -tulnp | grep <端口> / lsof -i :<端口>
- 连通性:telnet <端口> / nc -zv <端口>
- 网络质量:ping / traceroute
- DNS:nslookup <域名> / dig <域名>
- 防火墙:sudo ufw status 与(云上)安全组规则
- 建议顺序:
- 确认服务在目标机器监听正确端口 → 2) 用 telnet/nc 验证端口可达 → 3) 校验防火墙/安全组 → 4) 用 ping/traceroute 检查链路 → 5) 校验DNS → 6) 调整代码/连接池超时与重试 → 7) 查看数据库/应用日志与系统日志(如 journalctl -xe) → 8) 必要时抓包(如 Wireshark)或联系网络侧。