Java 连接到远程MySQL数据库时发生通信链路故障
我试图让一个Java程序与一个MySQL服务器进行通信,该服务器由一个小桔子托管。他们提供给我的IP和端口是129.121.106.234:3306。用户已被授予对数据库的完全权限,在我的CPanel中,我通过添加访问主机“%”允许所有远程主机连接到MySQL数据库 我使用的是Eclipse,我下载了JDBC驱动程序并将其添加到构建路径中 据我所知,我尝试使用的用户对数据库拥有完全权限,MySQL服务器对来自任何IP的任何请求都是开放的。我还尝试了我的管理MySQL凭据,但出现了相同的错误,因此我确信问题出在我的代码上。但我不是绝对确定,因为我自己不是MySQL服务器的宿主 我的代码:Java 连接到远程MySQL数据库时发生通信链路故障,java,mysql,database,jdbc,Java,Mysql,Database,Jdbc,我试图让一个Java程序与一个MySQL服务器进行通信,该服务器由一个小桔子托管。他们提供给我的IP和端口是129.121.106.234:3306。用户已被授予对数据库的完全权限,在我的CPanel中,我通过添加访问主机“%”允许所有远程主机连接到MySQL数据库 我使用的是Eclipse,我下载了JDBC驱动程序并将其添加到构建路径中 据我所知,我尝试使用的用户对数据库拥有完全权限,MySQL服务器对来自任何IP的任何请求都是开放的。我还尝试了我的管理MySQL凭据,但出现了相同的错误,因此
package com.package.IPBounce;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
* Isaac the Support Ninja says: The MySQL port is 3306. The IP you use
* is 129.121.106.234.
*/
URL whatismyip;
String IP;
try {
whatismyip = new URL("http://checkip.amazonaws.com");
BufferedReader in = new BufferedReader(new InputStreamReader(
whatismyip.openStream()));
IP = in.readLine();
System.out.println(IP);
Connection con = null;
Statement st = null;
ResultSet rs = null;
//this is just testing code until I get the connection working
String url = "jdbc:mysql://129.121.106.234:3306/db_name";
String user = "user_name";
String password = "small_password";
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url, user, password);//error is on this line
st = con.createStatement();
rs = st.executeQuery("SELECT VERSION()");
if (rs.next()) {
System.out.println(rs.getString(1));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
错误文本:
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(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1137)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:356)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2504)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2541)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2323)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:832)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:417)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:344)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.package.IPBounce.Main.main(Main.java:39)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:258)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:306)
... 15 more
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
位于com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1137)
在com.mysql.jdbc.MysqlIO上(MysqlIO.java:356)
位于com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2504)
位于com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2541)
位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2323)
位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:832)
JDBC4Connection.(JDBC4Connection.java:46)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:417)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:344)
位于java.sql.DriverManager.getConnection(未知源)
位于java.sql.DriverManager.getConnection(未知源)
位于com.package.IPBounce.Main.Main(Main.java:39)
原因:java.net.ConnectException:连接超时:连接
位于java.net.DualStackPlainSocketImpl.connect0(本机方法)
位于java.net.DualStackPlainSocketImpl.socketConnect(未知源)
位于java.net.AbstractPlainSocketImpl.doConnect(未知源)
位于java.net.AbstractPlainSocketImpl.connectToAddress(未知源)
位于java.net.AbstractPlainSocketImpl.connect(未知源)
位于java.net.PlainSocketImpl.connect(未知源)
位于java.net.socksocketimpl.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket。(未知源)
位于java.net.Socket。(未知源)
位于com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:258)
在com.mysql.jdbc.MysqlIO上(MysqlIO.java:306)
... 还有15个
编辑:我找到了解决方案。我的主机服务在防火墙上阻止MySQL请求。澄清了这一点,现在它工作得非常好。这个问题已经在这里得到了回答: 请尝试接受答案中的步骤,看看您的问题是否得到解决
根据我的经验,当我的MySql配置文件只允许
localhost
访问时,我就遇到了这个问题。用ip地址替换localhost。我认为唯一可能的问题是“newInstance()”调用。试着把它去掉,看看是否有效
发件人:
Class.forName("com.mysql.jdbc.Driver").newInstance();
致:
主机是否能够监控流量并验证您是否正在进行tcp/3306连接?我无法连接到该IP上的该端口,因此“对来自任何IP的任何请求开放”是不正确的,或者服务器本身当前无法访问。我应该提到的是,我已经尝试了所有这些步骤,但都不起作用。应该放进去的,对不起。
Class.forName("com.mysql.jdbc.Driver");