在我的主机上,我安装了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) at 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) 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.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但是我真的不知道如何更改它们,因为我没有找到这方面的例子特定的情况。我还认为,当mysql正常使用3306时,我将端口更改为8080的事实可能会导致问题。
所以,问题是,我怎么能做到这一点?感谢。
编辑:我还想添加端口更改(到8080)是在服务器上的apache的conf文件中进行的。默认情况下这是80.所以也许它不应该影响到mysql的3306。
答案 0 :(得分:2)
另一件事是,在虚拟机上,我可以访问 使用浏览器的数据库。
这意味着您可以从VM上的浏览器运行位于HOST上的网站。这与从远程PC连接不太一样。在这种情况下,运行的代码,即我假设的PHP,正在HOST上运行,并从PHP连接到MYSQL,所有这些都是主机。
默认情况下,section/div/element
帐户,如果您使用的是只允许连接,如果它是在运行MySQL的同一台PC上运行的话。
尝试创建一个新的MySQL用户帐户,确保允许这个新帐户从虚拟机的ip登录MySQL。
例如:
root
这应该允许帐户CREATE USER 'Florina'@'192.168.1.%' IDENTIFIED BY 'A-Password';
GRANT ALL PRIVILEGES ON Your_Database TO 'Florina'@'192.168.1.%';
从您子网上的任何地址连接到MYSQL服务器,因此如果VM在每次重新启动后获得不同的IP地址都无关紧要。
检查防火墙是否允许远程连接到端口8080也是一个好主意!如果你只是对端口的改变感到困惑,请使用3306。
实际上你确定你改变MYSQL来监听端口8080,或者你改变 Apache 来监听端口8080.如果你改变了apache然后你会进入浏览器中包含Florina
的网址。 这并不意味着MySQL正在侦听端口8080 在这种情况下从您的
:8080
:8080
答案 1 :(得分:0)
通常,mysql DB正在侦听3306port而不是8080端口,除非你改变它
如果8080端口号正确,请尝试从VM命令行ping IP地址,并检查你的mysql服务是否已启动。
答案 2 :(得分:-1)
尝试使用:Class.forName("com.mysql.jdbc.Driver");
代替:Class.forName("com.mysql.jdbc.Driver").newInstance();