2014-02-23 120 views
9

我試圖連接到我的遠程MySQL數據庫,但我失敗了,並得到這個錯誤。「com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信鏈接失敗」到遠程數據庫

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

的困惑是,當我使用的MySQL前端工具連接遠程數據庫它是有效的,而且我可以ping到IP地址成功。但是當我使用我的代碼時,約十秒鐘後它會顯示錯誤。

另外,當我在我的代碼中使用了錯誤的用戶名或密碼時,它立即顯示錯誤的驗證。這是否證明建立連接沒有問題?

這裏是我的代碼(可在我的本地數據庫工作):

public static void main(String[] args) { 
     String url = "jdbc:mysql://(IP address):3306/"; 
     String dbName = "talk"; 
     String driver = "com.mysql.jdbc.Driver"; 
     String userName = "talkroot"; 
     String password = "123456"; 
     try { 
      Class.forName(driver).newInstance(); 
      Connection conn = DriverManager.getConnection(url + dbName, 
        userName, password); 
      System.out.println("connect"); 
      conn.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("end"); 
    } 

以下是錯誤:

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

Last packet sent to the server was 0 ms ago. 
    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:406) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2120) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:723) 
    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:406) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at com.test.TestMySQL.main(TestMySQL.java:16) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

Last packet sent to the server was 21298 ms ago. 
    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:406) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3009) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2895) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3438) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548) 
    at com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.java:1802) 
    at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3444) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2062) 
    ... 12 more 
Caused by: java.net.SocketException: Software caused connection abort: recv failed 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113) 
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160) 
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188) 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2452) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2906) 
    ... 20 more 

任何人都可以幫我嗎?

+0

是你的mysql服務器上運行?搜索**軟件導致連接中止:recv失敗** – agpt

+0

它正在運行。我可以連接它並使用MySQL-Front進行操作。 – chenupt

+0

如果MySQL連接了很長時間,前端超時了嗎? – chrylis

回答

1

您可以嘗試替換mysql-connector-java-version.jar jar文件。有些人將jar文件從5.1.10更新到5.1.14,然後運行。祝你好運..

+0

: ** HTTP給出同樣的錯誤。 – Sridhar

+0

更新不會工作 –

+0

更新概念是完全假的! – kkjava

3

如果您的數據庫連接長時間處於空閒狀態,則會發生com.mysql.jdbc.exceptions.jdbc4.CommunicationsException異常。此空閒連接在connection.isClosed();上返回true。但如果我們嘗試執行語句,那麼它會觸發這個異常,所以我會建議使用數據庫池。

2

通常,當您不使用正確的端口號時會發生此錯誤。可能是在這個數據庫上工作的機器(client'db)有不同的端口號。 (例如:3307)。
去任務管理器==>服務==>服務並檢查是否有其他版本的mysql。如果他們使用3306更改端口到3307

1

更新您的驅動器版本:

<dependency> 
<groupId>mysql</groupId> 
<artifactId>mysql-connector-java</artifactId> 
<version>5.1.18</version> 

1

,仔細檢查下列事情:

  • 驗證是否IP地址/端口編號是否正確
  • 使用ping「服務器IP地址」可以告知服務器處於啓動模式/關機模式
  • 如果您從連接池中獲取連接對象,請驗證 一旦連接可用。

希望這個信息可以幫助...

1

我從連接URL刪除端口號來解決它。

因此,而不是使用連接字符串:

jdbc:mysql://12x.xxx.xxx.xxx:1527/yourdbname 

使用

jdbc:mysql://12x.xxx.xxx.xxx/yourdbname

1

Also when I used the wrong username or password in my code, it wound show the wrong verification immediately. Did that prove it is no problem to set up conection?

這可能是在本地完成。所以它不涉及爲什麼你的代碼不工作。

似乎有很多方法可以解決這個問題,所以你可以嘗試多種方法;人們已經解決了在不同的方面,這鏈路故障按照自己的情況:

下面是一些解決方法:

  • 改變「綁定地址」屬性

取消註釋「bind-地址「屬性或將其更改爲以下IP之一:

bind-address =」127.0.0.1「

綁定地址= 「0.0.0.0」

  • 註釋掉 「跳過網絡」

如果在你的MySQL 「跳過聯網」 行配置文件,通過在該行的開頭添加「#」符號進行註釋。

  • 變化 「WAIT_TIMEOUT」 和 「interactive_timeout」

這些行添加到MySQL配置文件:

[WAIT_TIMEOUT] [1] =

interactive_timeout = number

connect_timeout =

  • 檢查操作系統代理設置

確保防火牆或防病毒軟商品不會阻止MySQL服務。

  • 改變連接字符串

檢查您的查詢字符串。您的連接字符串應該是這樣的:

dbName = "my_database"; 
dbUserName = "root"; 
dbPassword = ""; 
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8"; 

請確保您的字符串中沒有空格。所有的連接字符串都應該繼續,沒有任何空格字符。

嘗試用您的端口替換「localhost」,如127.0.0.1。 也試圖端口號碼添加到您的連接字符串,如:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8"; 

爲MySQL通常默認端口是3306。

不要忘記更改用戶名和密碼到你的MySQL的用戶名和密碼服務器。

  • 更新你的JDK的驅動程序庫文件
  • 測試不同的JDK和JRE中(如JDK 6和7)
  • 不改變max_allowed_pa​​cket的

「[max_allowed_pa​​cket的] [4]「是MySQL配置文件中的一個變量,用於指示最大數據包大小,而不是數據包的最大數量。所以這無助於解決這個錯誤。

  • 變化Tomcat安全

變化TOMCAT6_SECURITY = yes來TOMCAT6_SECURITY =沒有

  • 使用validationQuery財產

使用validationQuery =「現在選擇() 「以確保每個曲紅黴素有反應

  • autoReconnect的

將此代碼添加到您的連接字符串:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10 
1

你的MySQL服務器沒有運行。如果您正在運行Windows,請檢查任務管理器的服務頁面中的相同內容。

0

如果您正在使用亞馬遜Ubuntu的情況下工作,那麼你必須按照此步驟:

  1. 檢查亞馬遜實例
  2. 檢查實例的安全組
  3. 分配的mysql /光環服務並添加您的機器ip here或 服務提供商ip
0

請更新你的MySQL配置文件/etc/mysql/my.cnf文件

默認情況下,MySQL只允許從本地主機地址的連接。配置文件通常在/etc/mysql/my.cnf找到

你會想使它看起來像這樣註釋掉綁定地址線:

#bind-address  = 127.0.0.1 

接下來,您將需要重新啓動數據庫服務器:

sudo /etc/init.d/mysql restart 
相關問題