繁体   English   中英

无法使用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:通信链接失败

成功发送到服务器的最后一个数据包是在0毫秒之前。 驱动程序尚未收到来自服务器的任何数据包。 在java.lang.java处sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)处.newInstance(Constructor.java:526)位于com.mysql.jdbc.Util.handleNewInstance(Util.java:400)位于com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1038)位于com.mysql.jdbc。 com.mysql.jdbc上的MysqlIO.readPacket(MysqlIO.java:628)com.mysql.jdbc上的MysqlIO.doHandshake(MysqlIO.java:1014)com.mysql.jdbc上的com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2249) com.mysql.jdbc的.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280)。com.mysql.jdbc的com.mysql.jdbc.ConnectionImpl。(ConnectionImpl.java:794)的ConnectionImpl.createNewIO(ConnectionImpl.java:2079) .JDBC4Connection。(JDBC4Connection.java:44)在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)在s com.mysql上的java.lang.reflect.Constructor.newInstance(Constructor.java:526)上的sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)上的un.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) Java的com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)的.jdbc.Util.handleNewInstance(Util.java:400)在Java的com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) sql.DriverManager.getConnection(DriverManager.java:571)at java.sql.DriverManager.getConnection(DriverManager.java:215)at DatabaseConnection.main(DatabaseConnection.java:12)原因:java.io.EOFException:无法读取来自服务器的响应。 预期读取4个字节,在意外丢失连接之前读取0个字节。 在com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2926)处com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:560)... 16另外

我相信问题可能出在客户端的mysql设置中,位于文件/etc/mysql/my.cnf中,但是我真的不知道如何更改它们,因为我没有找到针对这种特殊情况的示例。 我还认为,当mysql通常使用3306时,我将端口更改为8080可能会引起问题。

因此,问题是,我该如何进行这项工作? 谢谢。

编辑:我还想补充一下,端口更改(到8080)是在服务器上apache的conf文件中进行的。 默认情况下是80。所以也许它不应该影响mysql的3306。

另一件事是,在虚拟机上,我可以使用浏览器访问数据库。

这表示您可以通过VM上的浏览器运行位于HOST上的网站。 那与从远程PC连接并不完全相同。 在这种情况下,正在运行的代码(即我假设的PHP)在主机上运行,​​并且从PHP连接到MYSQL,所有这些都在主机上。

默认情况下,如果那是您正在使用的root帐户,则只有在与MySQL正在运行的同一台PC上运行时,才允许连接该root帐户。

尝试创建一个新的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 Server,因此虚拟机在每次重新启动后是否获得不同的IP地址都没有关系。

检查防火墙是否允许远程连接到8080端口也是一个好主意! 和3306如果您只是对端口更改感到困惑。

实际上,您确定已将MYSQL更改为在端口8080上侦听,还是将Apache更改为在端口8080上侦听。如果更改了apache,则将在浏览器中使用:8080输入URL。 这并不意味着MySQL正在端口8080上侦听。在这种情况下,请从您的端口中删除:8080

 String url = "jdbc:mysql://192.168.1.236/fps";

通常,除非您将其更改,否则mysql DB正在侦听3306port而不是8080端口

如果8080端口号正确,请尝试从VM命令行ping IP地址,然后检查ur mysql服务是否已启动。

尝试使用: Class.forName("com.mysql.jdbc.Driver");

而不是: Class.forName("com.mysql.jdbc.Driver").newInstance();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM