首页 文章

无法使用java从VM连接到mysql数据库

提问于
浏览
1

在我的主机上,我安装了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毫秒前 . 驱动程序未收到来自服务器的任何数据包 . 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)位于com.mysql.jdbc.Util.handleNewInstance(Util.java:400)的com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1038)com.mysql.jdbc . MysqlIO.readPacket(MysqlIO.java:628)位于com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1014)的com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2249)com.mysql.jdbc com.mysql.jdbc的com.mysql.jdbc.ConnectionImpl . (ConnectionImpl.java:794)的com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2079)上的.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280) .JDBC4Connection . (JDBC4Connection.java:44)at s的sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)在com.mysql的java.lang.reflect.Constructor.newInstance(Constructor.java:526)的sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)中的un.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) .jdbc.Util.handleNewInstance(Util.java:400)位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399),位于java的com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) . 在DatabaseConnection.main上的java.sql.DriverManager.getConnection(DriverManager.java:215)中的sql.DriverManager.getConnection(DriverManager.java:571)(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 .

3 回答

  • 2

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

    这意味着您可以从VM上的浏览器运行位于HOST上的网站 . 这与从远程PC连接不太一样 . 在这种情况下,运行的代码,即我假设的PHP,正在HOST上运行,并从PHP连接到MYSQL,所有这些都是在主机上 .

    默认情况下 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如果你只是对端口的变化感到困惑 .

    实际上 are you sure 你改变了MYSQL来侦听端口8080,或者你改变 Apache 来监听端口8080.如果你改变了apache然后你将输入一个url浏览器 :8080 . This does not mean that MySQL is listening on port 8080 在这种情况下,请从您的帐号中删除 :8080

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

    通常,mysql DB正在侦听3306port,而不是8080端口,除非你改变它

    如果8080端口号正确,请尝试从VM命令行ping IP地址,并检查您的mysql服务是否为UP .

  • -1

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

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

相关问题