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

问题描述:

在我的主机上我已经安装了Wamp,并且我可以使用PHP或浏览器进行连接。我的客户端是一台装有Linux的虚拟机,我正尝试连接主机上的数据库以在其中添加一些条目。无法使用Java从VM连接到VM的mysql数据库

这里是我的代码:

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。

+0

问题去掉:8080可能在网络通信。确保你能ping通主机并确保在8080端口上运行mysql。 – Sridhar

+0

怎么样mysql-connector.jar文件?你添加了吗? – Anptk

+0

我认为mysql的端口是从3306到3309 – Anptk

Another thing is that, on the virtual machine, I can access the database using a browser.

通过这个,你的意思是你可以在虚拟机上的浏览器上运行一个位于主机上的网站。这与从远程PC连接不完全相同。在这种情况下,运行的代码,即我假设的PHP运行在HOST上,并从PHP连接到MYSQL,所有这些都在ON HOST上。

默认情况下,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地址,它不会不管。

检查您的Firewall是否允许远程连接到端口8080也是一个好主意!而3306如果你只是对港口变化感到困惑。

其实你确定你改变MYSQL监听端口8080,还是你改变阿帕奇为侦听端口8080。如果你改变了Apache的,那么你将进入与:8080浏览器的URL。 这并不意味着MySQL是在8080端口上监听在这种情况下,从您的

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

它不关于权限或访问被拒绝。它是关于通信错误。 – Sridhar

+0

通过“使用浏览器”,我的意思是我可以访问 http://192.168.1。2368080/phpmyadmin/ – Florina

+0

看到最后一段,我不认为你改变了MySQL在8080上进行监听,这是你改变的Apache!如果修复/更改错误,然后创建新的MySQL帐户并相应地更改登录详细信息 – RiggsFolly

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

代替:Class.forName("com.mysql.jdbc.Driver").newInstance();

+0

'Class.forName(“com.mysql.jdbc.Driver”)'是OP已经拥有的第一步,移除'newInstance()'不应该改变任何东西。另外,实现JDBC 4的驱动程序甚至不需要'Class.forName'调用。 – Pshemo

+0

我试过了,没有工作。 – Florina

正常的MySQL数据库是听3306port而不是8080端口除非ü改变

如果8080端口号是否正确,请尝试从虚拟机命令行ping IP地址,并检查你的MySQL服务是否UP。

+0

Ping工作得很好。但是,我检查是否mysql与mysqladmin -u root -p状态一起运行,并且出现错误: mysqladmin:在'localhost'连接到服务器失败 错误:'无法通过套接字连接到本地MySQL服务器'/ var/run/mysqld/mysqld.sock'(2)' 检查mysqld是否正在运行,并且套接字'/var/run/mysqld/mysqld.sock'存在! – Florina

+0

是否从VM执行该命令行?如果是的话尝试使用mysql -h 192.168.1.236 -u root -p来包含主机,并告诉我你得到了什么 –

+0

正在运行mysql -h 192.168.1.236 -u root -p没有给出任何输出,它似乎卡住了。我认为它会超时 – Florina