【发布时间】:2017-02-24 23:35:33
【问题描述】:
我知道这个问题已经问了很多,但是在尝试了很多在这里找到的解决方案之后,我仍然无法连接到我的数据库。
我在 PC 上工作,我想连接到我局域网中另一台机器上的 mariadb mysql 服务器。但我想以这样一种方式做到这一点,即我的程序可以从任何地方连接到我的 mysql 服务器。不仅来自mysql所在的这台机器或局域网中的PC。
我认为使用我的外部 IP 并在路由器上转发 mysql 端口可以解决问题,但我收到“通信失败”错误。
到目前为止,我确定:
- -用户、密码、数据库名正确
- -端口默认为3306
- -在 mysql 配置中我禁用了绑定地址
- -在 mysql 中,我的用户被允许从任何主机和我的外部 IP 进行连接,以确保...
- -数据库为空
- -其他数据库正在工作,php可以连接,但它在同一台服务器上执行,所以它连接到'localhost'
- -DriverManager.getConnection("jdbc:mysql://MY_IP:3306/my_DB","javauser", "javauserpass");
- -在安装了 mysql 服务器的机器上 (UbuntuServer) iptables 没有配置
- -我安装了 xampp 并在那里创建了 db。我可以在登录查询字符串中使用“localhost”连接到这个数据库。但这使我的程序只能在本地运行。
- -非活动防火墙不会改变任何东西 - 仍然没有连接
错误:
-------- MySQL JDBC Connection Testing ------------
MySQL JDBC Driver Registered!
Connection Failed! Check output console
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(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:341)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2251)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at Main.main(Main.java:25)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:211)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
... 15 more
我的例子,测试程序取自这里:https://www.mkyong.com/jdbc/how-to-connect-to-mysql-with-jdbc-driver-java/
那么我在哪里犯错了?
【问题讨论】:
-
这是什么意思,它与连接数据库有什么关系? “我的程序可以由我的朋友在我局域网外的 PC 上编辑”
-
这没有任何意义。如果您希望您的朋友能够从您的局域网外,甚至在您的局域网内编辑您的程序,请将您的源代码托管在 GitHub 或 BitBucket 上。您对 mariadb 连接所做的操作与朋友编辑您的程序完全无关。
-
暂时忽略所有 Java 位。如果您执行
telnet <mysql host> <mysql port>(或nc <mysql host> <port>)会发生什么。该异常只是连接超时异常,因此看起来您要么在不同的网络上,要么端口被防火墙。 -
防火墙或未设置远程连接。绑定地址,跳过网络,守护进程重启。 nixCraft
-
@DavidEhrmann 我编辑了问题。重点不是我的朋友如何编辑我的程序,而是使用它的任何人如何连接到我的数据库。 Telnet 给了我这个:'telnet:无法连接到远程主机:资源暂时不可用'