2014-06-20 252 views
-1

我試圖讓一個Java程序與一個用小橙子託管的MySQL服務器進行通信。他們提供給我的IP和端口是129.121.106.234:3306。用戶已獲得數據庫的完全權限,並且在我的CPanel中,我已通過添加訪問主機「%」允許所有遠程主機連接到MySQL數據庫。連接到遠程MySQL數據庫時通信鏈接失敗

我正在使用Eclipse,並且已經下載並將JDBC驅動程序添加到構建路徑。

據我所知,我試圖使用的用戶具有對數據庫的完全權限,並且MySQL服務器可以接受來自任何IP的任何請求。我也嘗試了我的管理MySQL憑證,並且出現了相同的錯誤,所以我非常確定問題出在我的代碼上。但不是絕對確定,因爲我不是自己託管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 

編輯:我找到了解決辦法。我的託管服務阻止了防火牆的MySQL請求。清除了,現在它奇妙地工作。

+0

是主機能夠監控流量並驗證你正在做一個TCP/3306連接?我無法連接到該IP上的該端口,因此「對來自任何IP的任何請求開放」可能不正確,或者服務器本身當前無法訪問。 – admdrew

回答

-1

這個問題已經在這裏找到答案:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

請儘量在接受答案的步驟,看看你的問題是否得到解決。

從我的經驗來看,當我的MySql配置文件只允許localhost訪問時,我遇到了這個問題。將localhost替換爲ip地址。

+0

我應該提到,我已經嘗試了所有這些步驟,而且都沒有工作。應該把它放進去,對不起。 – user2221135

0

我認爲唯一可能的問題是「newInstance()」調用。嘗試刪除,看看是否有效。

來源:

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

要:

Class.forName("com.mysql.jdbc.Driver");