MySQL JDBC通信链路失败求助(Windows+WSL环境)
MySQL JDBC连接本地数据库报Connection Refused的排查方案
问题背景
使用JavaFX+JDBC连接本地MySQL时,DriverManager.getConnection()抛出连接拒绝错误,核心栈跟踪片段如下:
Caused by: java.net.ConnectException: Connection refused
环境:Windows 10 + VSCode + Debian WSL编译运行,已安装MySQL Server/Workbench/Connector/J 8.0.33,可正常连接在线数据库,小组其他成员能连接本地库,尝试过关闭防火墙、调整JDBC URL、修改my.ini、重装/降级MySQL、检查权限等常规方案均无效。
出错代码:
public Connection dbconnect() { Connection conn = null; try { conn = DriverManager .getConnection( "jdbc:mysql://127.0.0.1:3306/cookbook?user=root&password=ABC&useSSL=false"); } catch (SQLException e) { System.out.println(e.getMessage()); } return conn; }
针对性排查思路
修正WSL与Windows的网络互通问题
WSL2的127.0.0.1是自身回环地址,无法直接访问Windows本地的MySQL服务:- 在Windows命令行执行
ipconfig,找到本地网卡的IPv4地址(如192.168.1.105) - 在WSL终端测试连通性:
ping 192.168.1.105,再测试端口:nc -zv 192.168.1.105 3306 - 将JDBC URL中的
127.0.0.1替换为该Windows主机IP,同时添加时区参数避免额外异常:jdbc:mysql://192.168.1.105:3306/cookbook?user=root&password=ABC&useSSL=false&serverTimezone=UTC
- 在Windows命令行执行
确认MySQL绑定的监听地址
- 打开Windows下的MySQL配置文件(my.ini/my.cnf),找到
bind-address配置项 - 将其从
127.0.0.1修改为0.0.0.0(允许所有IP访问)或Windows主机IP - 重启MySQL服务,执行
netstat -ano | findstr :3306确认监听地址已变更
- 打开Windows下的MySQL配置文件(my.ini/my.cnf),找到
严格验证MySQL用户的连接权限
- 通过Workbench登录MySQL,执行查询:
SELECT user, host FROM mysql.user; - 若
root用户的host为localhost,则仅允许Windows本地连接,需更新权限:ALTER USER 'root'@'%' IDENTIFIED BY 'ABC'; FLUSH PRIVILEGES;
(注:
%允许所有IP访问,测试完成后可改为WSL的IP段以提升安全性)- 通过Workbench登录MySQL,执行查询:
检查WSL内部的网络规则
Debian WSL默认可能启用iptables,临时清空规则测试:sudo iptables -F若连接恢复,需调整iptables规则允许出站访问3306端口。
切换WSL版本测试
WSL1与Windows共享网络栈,127.0.0.1可直接访问Windows服务,可尝试将WSL切换为版本1:# 在Windows PowerShell中执行 wsl --set-version Debian 1
内容的提问来源于stack exchange,提问作者Astruin
相关产品推荐
相关产品推荐

