无法使用 java 从 VM 连接到 mysql 数据库
Cannot connect to mysql database from VM using java
在我的主机上,我安装了 Wamp,我可以使用 PHP 或浏览器进行连接。我的客户端是一个 Linux 的虚拟机,我正在尝试连接到主机上的数据库以在其中添加一些条目。
这是我的代码:
Connection conn = null;
try {
String url = "jdbc:mysql://192.168.1.236:8080/fps";
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(url, "username", "password");
System.out.println("Database connection established");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
System.out.println("Database connection terminated");
} catch (Exception e) {}
}
}
我必须提到我正在尝试通过本地网络进行连接,而且我将 Wamp 设置为在端口 8080 上工作(可以在上面看到)。还有就是,在虚拟机上,我可以使用浏览器访问数据库。
上面的代码产生错误:
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:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:400)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1038)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:628)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1014)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2249)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2079)
at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:794)
at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:400)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at DatabaseConnection.main(DatabaseConnection.java:12)
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2926)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:560)
... 16 more
我认为问题可能出在客户端 mysql 的设置,在文件 /etc/mysql/my.cnf 中,但我真的不知道如何更改它们,因为我没有为这种特殊情况找一个例子。我还认为,当 mysql 通常使用 3306 时,我将端口更改为 8080,这可能会导致问题。
所以,问题是,我怎样才能完成这项工作?谢谢
编辑:我还想补充一点,端口更改(更改为 8080)是在服务器上的 apache conf 文件中进行的。默认情况下为 80。所以它可能不会影响 mysql 的 3306。
尝试使用:Class.forName("com.mysql.jdbc.Driver");
而不是:Class.forName("com.mysql.jdbc.Driver").newInstance();
通常 mysql DB 正在监听 3306 端口而不是 8080 端口,除非你改变它
如果 8080 端口号正确,请尝试从 VM 命令行 ping IP 地址并检查您的 mysql 服务是否正常。
Another thing is that, on the virtual machine, I can access the
database using a browser.
这是否意味着您可以 运行 从 VM 上的浏览器访问位于 HOST 上的网站。这与从远程 PC 连接不是一回事。在这种情况下,代码 运行ning 即 PHP 我假设是 运行ning 在主机上并从 PHP 连接到 MYSQL 所有这些都在 THE主持人。
默认情况下,root
帐户,如果您使用的是 运行 来自与 MySQL 是 运行 的同一台 PC,则仅允许连接]继续。
尝试创建一个新的 MySQL 用户帐户,确保允许这个新帐户从 VM 的 ip 登录 MySQL。
例如:
CREATE USER 'Florina'@'192.168.1.%' IDENTIFIED BY 'A-Password';
GRANT ALL PRIVILEGES ON Your_Database TO 'Florina'@'192.168.1.%';
这应该允许帐户 Florina
从您子网上的任何地址连接到 MYSQL 服务器,因此即使 VM 在每次重启后获得不同的 IP 地址也没有关系。
检查您的防火墙是否允许远程连接到端口 8080 也是一个好主意!还有 3306,如果您只是对端口更改感到困惑。
事实上 你确定吗 你改变了 MYSQL 来监听端口 8080 还是你改变了 Apache 来监听端口 8080。如果您更改了 apache,那么您将在带有 :8080
的浏览器中输入 url。 这并不意味着 MySQL 正在侦听端口 8080 在这种情况下,请从您的
中删除 :8080
String url = "jdbc:mysql://192.168.1.236/fps";
在我的主机上,我安装了 Wamp,我可以使用 PHP 或浏览器进行连接。我的客户端是一个 Linux 的虚拟机,我正在尝试连接到主机上的数据库以在其中添加一些条目。
这是我的代码:
Connection conn = null;
try {
String url = "jdbc:mysql://192.168.1.236:8080/fps";
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(url, "username", "password");
System.out.println("Database connection established");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
System.out.println("Database connection terminated");
} catch (Exception e) {}
}
}
我必须提到我正在尝试通过本地网络进行连接,而且我将 Wamp 设置为在端口 8080 上工作(可以在上面看到)。还有就是,在虚拟机上,我可以使用浏览器访问数据库。
上面的代码产生错误:
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:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1038) at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:628) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1014) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2249) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2079) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:794) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) at java.sql.DriverManager.getConnection(DriverManager.java:571) at java.sql.DriverManager.getConnection(DriverManager.java:215) at DatabaseConnection.main(DatabaseConnection.java:12) Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2926) at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:560) ... 16 more
我认为问题可能出在客户端 mysql 的设置,在文件 /etc/mysql/my.cnf 中,但我真的不知道如何更改它们,因为我没有为这种特殊情况找一个例子。我还认为,当 mysql 通常使用 3306 时,我将端口更改为 8080,这可能会导致问题。
所以,问题是,我怎样才能完成这项工作?谢谢
编辑:我还想补充一点,端口更改(更改为 8080)是在服务器上的 apache conf 文件中进行的。默认情况下为 80。所以它可能不会影响 mysql 的 3306。
尝试使用:Class.forName("com.mysql.jdbc.Driver");
而不是:Class.forName("com.mysql.jdbc.Driver").newInstance();
通常 mysql DB 正在监听 3306 端口而不是 8080 端口,除非你改变它
如果 8080 端口号正确,请尝试从 VM 命令行 ping IP 地址并检查您的 mysql 服务是否正常。
Another thing is that, on the virtual machine, I can access the database using a browser.
这是否意味着您可以 运行 从 VM 上的浏览器访问位于 HOST 上的网站。这与从远程 PC 连接不是一回事。在这种情况下,代码 运行ning 即 PHP 我假设是 运行ning 在主机上并从 PHP 连接到 MYSQL 所有这些都在 THE主持人。
默认情况下,root
帐户,如果您使用的是 运行 来自与 MySQL 是 运行 的同一台 PC,则仅允许连接]继续。
尝试创建一个新的 MySQL 用户帐户,确保允许这个新帐户从 VM 的 ip 登录 MySQL。
例如:
CREATE USER 'Florina'@'192.168.1.%' IDENTIFIED BY 'A-Password';
GRANT ALL PRIVILEGES ON Your_Database TO 'Florina'@'192.168.1.%';
这应该允许帐户 Florina
从您子网上的任何地址连接到 MYSQL 服务器,因此即使 VM 在每次重启后获得不同的 IP 地址也没有关系。
检查您的防火墙是否允许远程连接到端口 8080 也是一个好主意!还有 3306,如果您只是对端口更改感到困惑。
事实上 你确定吗 你改变了 MYSQL 来监听端口 8080 还是你改变了 Apache 来监听端口 8080。如果您更改了 apache,那么您将在带有 :8080
的浏览器中输入 url。 这并不意味着 MySQL 正在侦听端口 8080 在这种情况下,请从您的
:8080
String url = "jdbc:mysql://192.168.1.236/fps";