【问题标题】:Cannot connect to mysql database from VM using java无法使用java从VM连接到mysql数据库
【发布时间】:2015-10-10 14:18:21
【问题描述】:

在我的主机上,我安装了 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 毫秒前。驱动程序没有收到来自服务器的任何数据包。 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 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.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2079) 在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:794) 在 com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:400) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) 在 java.sql.DriverManager.getConnection(DriverManager.java:571) 在 java.sql.DriverManager.getConnection(DriverManager.java:215) 在 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 中,但我真的不知道如何更改它们,因为我没有找到这个示例特定情况。我还认为我将端口更改为8080,而mysql通常使用3306这一事实可能会导致问题。

所以,问题是,我怎样才能做到这一点?谢谢。

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

【问题讨论】:

  • 问题可能出在网络通信中。确保您能够 ping 主机并确保 mysql 在 8080 端口上运行。
  • mysql-connector.jar 文件怎么样?你添加了吗?
  • 我认为mysql端口是从3306到3309
  • 把端口改回3306还能用吗?
  • 使用 ping 验证和测试数据库服务器。

标签: java mysql wamp


【解决方案1】:

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

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

【讨论】:

  • Class.forName("com.mysql.jdbc.Driver") 是 OP 已经拥有的第一步,删除 newInstance() 不应该改变什么。此外,实现 JDBC 4 的驱动程序甚至不需要 Class.forName 调用。
【解决方案2】:

通常mysql数据库监听的是3306端口而不是8080端口,除非你改变它

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

【讨论】:

  • Ping 工作正常。但是,我检查了 mysql 是否正在使用 mysqladmin -u root -p status 运行,我得到一个错误:mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to local MySQL server through socket '/var/run /mysqld/mysqld.sock' (2)' 检查 mysqld 是否正在运行并且套接字:'/var/run/mysqld/mysqld.sock' 存在!
  • 您是否从虚拟机执行了该命令行?如果是,请尝试将主机包含在 mysql -h 192.168.1.236 -u root -p 中,并告诉我你得到了什么
  • 运行 mysql -h 192.168.1.236 -u root -p 没有给出任何输出,似乎卡住了。我认为它会超时
  • mysqladmin -h 192.168.1.236 -u root -p 怎么样?
  • 输出与我运行 mysqladmin 完全一样 - ?我试了很多次,只是为了确保没有错别字,结果一样。
【解决方案3】:

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

您的意思是说您可以通过虚拟机上的浏览器运行位于主机上的网站。这与从远程 PC 连接不完全相同。在这种情况下,运行的代码,即我假设的 PHP,正在主机上运行并从 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 Server,因此 VM 在每次重新启动后是否获得不同的 IP 地址都无关紧要。

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

事实上你确定你改变了 MYSQL 来监听端口 8080 还是你改变了 Apache 来监听端口 8080。如果你改变了 apache 那么你会进入浏览器中带有:8080 的网址。 这并不意味着 MySQL 正在侦听端口 8080 在这种情况下,请从您的

中删除 :8080
 String url = "jdbc:mysql://192.168.1.236/fps";

【讨论】:

  • 这与权限或访问被拒绝无关。这是关于通信错误。
  • “使用浏览器”是指我可以访问192.168.1.236:8080/phpmyadmin
  • 看最后一段,我不认为你改变了MySQL来监听8080,你改变的是Apache!如果修复/更改错误,则创建新的 MySQL 帐户并相应更改登录详细信息
  • @Sridhar 不是关于更改 Apache 侦听端口的小混乱以及也会影响 MySQL DBMS 侦听端口的想法
  • 谢谢!有效。我创建了一个新用户,完全停止了我的防火墙并删除了 :8080 并且一切正常。
猜你喜欢
  • 2016-09-30
  • 2011-07-03
  • 2017-01-20
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
相关资源
最近更新 更多