诡异! 为什么用 jdbc 不能访问虚拟机 NAT + port forwarding 后的 mysql 服务器?
因为撸代码需要, 我在虚拟机里装了一个 mysql 方便调试, 但由于最近撸代码环境变化频繁, 子网前缀一直变, 导致虚拟机的 ip 也总是变, 配置起来真麻烦, 于是我把虚拟机的网络设置为 NAT + port forwarding, 希望这样能通过 127.0.0.1 + 映射的端口号来访问虚拟机的 mysql, 结果就悲剧了。。。具体情况如下:
1 在 virtualbox 里装了一个 ubuntu, 上面安装了 mysql server, 服务端口号 3306,
2 然后在 virtualbox 里把网络设置为 NAT, 将虚拟机的 3306 端口映射为 host 的 9999 端口
这时, 在 host 机上用 mysql workbench 可以正常连接 127.0.0.1:9999, telnet 127.0.0.1 9999 也可以收到 mysql 的输入密码提示, 说明这套配置应该是正确的。
但是奇怪的是, 用 jdbc 在代码中去连时就不行了, 测试代码:
String url = "jdbc:mysql://127.0.0.1:9999/test?user=utest&password=pwd";
Class.forName ("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url);
报错 “ CommunicationsException: Communications link failure .... The last packet sent successfully to the server was 0 milliseconds ago.”
发在 stackoverflow 上半天没人理, 不知这里有没有人清楚原因? update: 我在 stackoverflow 更新了问题, 加了 50 rep bounty 欢迎回答
http://stackoverflow.com/questions/25580210/jdbc-cannot-connect-to-mysql-behind-nat-with-port-forwarding 把 mysql-java-connector 升级到最新 (5.1.32), 问题解决了...
背后的具体原因仍不清楚, 如有知悉, 还望大虾不吝赐教~ ----------------------- 以下是精选回复-----------------------
答:是不是还需要开放其他端口
答:额,不需要,抓个包看看呢
答:http://blog.csdn.net/helloworlddream/article/details/17753273
看看有没有帮助
答:你确定你的 MySQL 允许了远程访问?
答:至少在VMWARE里,NAT下宿主机是看不到虚拟机的,想要达到宿主机和虚拟机可以相互通讯,可以考虑Host Only或者Bridge
答:谢谢回复
1 虚拟机的 3306 端口已经映射到宿主机的 9999 端口
2 通过宿主机的 9999 端口已经可以用 mysql 客户端正确链接
3 用原文中的 java code 调 jdbc 去链接则报错网络错误
答:看看host跟guest的时间
答:Mac的NAT一直都有一些奇怪的毛病。
答:不能自己搜一下么?
http://stackoverflow.com/questions/13049563/communicationsexception-communications-link-failure
答:把 mysql-java-connector 升级到最新 (5.1.32), 问题解决了...
背后的具体原因仍不清楚, 如有知悉, 还望大虾不吝赐教~
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 诡异! 为什么用 jdbc 不能访问虚拟机 NAT + port forwarding 后的 mysql 服务器?
网站模板库 » 诡异! 为什么用 jdbc 不能访问虚拟机 NAT + port forwarding 后的 mysql 服务器?
0条评论