【发布时间】:2014-10-24 04:04:39
【问题描述】:
这个问题已经解决了。这是我检查“拒绝连接”错误所遵循的列表。
- MySQL 服务器状态
- 它正在运行吗?
- 是否禁用了 --skip-networking ?
- 是否绑定到地址 0.0.0.0 ?
- 该服务是否被任何防火墙阻止?
- 它是否在其日志文件中引发任何错误/警报/警告?
- 客户端状态
- 你能到达服务器ip/url吗?
- 你能用这个端口远程登录服务器吗?
- 可以在同一台机器上使用其他mysql客户端软件通过同一网络路由登录mysql服务吗?
- 检查防火墙设置
- 检查 mysql 连接器/驱动程序 !!
这个问题的答案似乎很愚蠢:我使用了一个过时的mysql驱动程序(5.1.9,当前最新版本是5.1.32)。
我仍然不知道为什么旧版本不起作用。
我在 virtualbox 托管的虚拟机中设置了一个 mysql 服务器,我可以使用命令行 mysql 客户端或 mysql 工作台在主机中成功连接到它。
但我无法使用具有相同 ip 和端口的 mysql jdbc 连接器连接到它。
我用 nat 连接了主机和 vm,端口将 mysql 服务器的 3306 转发到主机的 9936 端口。
我用来测试连接的java代码:
String url = "jdbc:mysql://127.0.0.1:9936/test";
Class.forName ("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url, "usr", "pwd");
这是错误:
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
这真的很奇怪,因为我可以成功地 telnet 到它并使用我能找到的任何 mysql 客户端连接到它,但是 java 代码不起作用!
2014 年 9 月 30 日更新
我尝试了以下步骤,但不起作用:
- 在主机和客户端计算机上禁用防火墙
- 将mysql服务地址绑定到0.0.0.0
- 确保 mysql 不会跳过网络
- 确保在“%”域上启用并授予连接到 mysql 的帐户
这是当前状态:
虚拟框设置:
我可以使用mysql客户端成功连接到它:
但简单的 jdbc 代码会引发错误:
添加证明:
mysql-connector-java 5.1.9:
mysql-connector-java 5.1.32:
【问题讨论】:
-
您的连接字符串指向 127.0.0.1,通常映射到 localhost。你不应该使用VM IP地址吗?你在说什么NAT?如果虚拟机只能从 LAN 内部访问,只需将虚拟网络接口设置为 LAN 中的 IP
-
@Raffaele 根据virtualbox.org/manual/ch06.html#network_nat 我们可以从主机到达虚拟机端口 A 的唯一方法是将其端口转发到主机的端口 B。因此对主机端口 B 的请求被转发到虚拟机的端口 A . 在这种情况下,对 127.0.0.1:9936 的请求被转发到 vm 的 3306 端口。配置必须正确,因为我可以使用其他客户端连接到 mysql 服务器。
-
查看 6.5“桥接网络”。这是一个简单的设置,只需要点击一个复选框,也许会解决你的问题
-
@Raffaele 谢谢。但是我选择使用NAT是因为主机是笔记本电脑……你知道,子网IP前缀是不断变化的。带有端口转发的 NAT 应该是最好的计划。
-
@Raffaele 问题不在于如何与虚拟机共享网络,而是为什么在 Java 代码中这个 NAT 计划不起作用。
标签: java mysql jdbc virtualbox nat