2013-03-20 87 views
0

工作時,當我嘗試我的java程序連接到服務器,我得到這個異常:如何解決「CommunicationsException:通信鏈接失敗」用JDBC和Android應用

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. 

所以,我發現這些指令:

如果你得到的SQLException:連接被拒絕或連接超時 或MySQL的具體CommunicationsException:通信鏈路 失敗,那麼就意味着數據庫是不可達的。這可能是 有一個或多個以下原因:

  1. JDBC URL中的IP地址或主機名是錯誤的。
  2. 本地DNS服務器無法識別JDBC URL中的主機名。
  3. JDBC URL中的端口號缺失或錯誤。
  4. 數據庫服務器已關閉。
  5. 數據庫服務器不接受TCP/IP連接。
  6. 數據庫服務器已用盡連接。
  7. Java和DB之間的東西阻塞連接,例如一個 防火牆或代理。

爲了解決一個或另一個,遵循以下建議:

  1. 驗證,並用ping測試。
  2. 刷新DNS或改爲使用JDBC URL中的IP地址。
  3. 根據MySQL.cn的my.cnf驗證。
  4. 啓動數據庫。
  5. 驗證mysqld是否在沒有--skip-networking選項的情況下啓動。
  6. 重新啓動數據庫並相應地修復您的代碼,最終關閉 連接。
  7. 禁用防火牆和/或配置防火牆/代理以允許/轉發端口 。

this的answere。

我試過每一個選項,但我不知道如何用'my.ini'配置文件來驗證端口號(選項3)。另外,我發現services.msc列表中缺少'MySQL'服務,但我確實使用了端口3306。它與問題有關嗎? 「my.ini」配置文件應該如何顯示? 我使用MySQL Workbench 5.2.47。 (MySQL服務器版本是5.6)。

我的連接代碼:

private MySQLConnectivity() { 

try { Class.forName("com.mysql.jdbc.Driver"); Connect(); 
} catch (ClassNotFoundException e) 
{ // TODO Auto-generated catch block e.printStackTrace(); } 
} 
public void Connect() { try { MySQLConnectivity.Conn = (Connection)DriverManager.getConnection(URL, USER, PASS); 
} catch (SQLException e) 
{ // TODO Auto-generated catch block e.printStackTrace(); 
} finally { } 
+0

我的連接代碼:私人MySQLConnectivity() \t { \t \t嘗試 \t \t { \t \t \t類。的forName( 「com.mysql.jdbc.Driver」); \t \t \t Connect(); \t \t} \t \t趕上(ClassNotFoundException的E) \t \t { \t \t \t // TODO自動生成的catch程序塊 \t \t \t e.printStackTrace(); \t \t} \t} \t \t 公共無效連接() \t { \t \t嘗試 \t \t { \t \t \t MySQLConnectivity.Conn =(連接)的DriverManager.getConnection(URL,USER,PASS); \t \t} \t \t趕上(的SQLException E) \t \t { \t \t \t // TODO自動生成的catch程序塊 \t \t \t e.printStackTrace(); \t \t} \t \t最後 \t \t { \t \t} – 2013-03-20 16:31:15

回答

2

我使用最新版本的ADT和mysql-connector-java-5.1.17-bin.jar的,這個工作對我來說:

添加下面的代碼到你的mafile setContentView(R.layout.activity_main)後;

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 

,並使用import android.os.StrictMode;

如果使用新的API,加@SuppressLint("NewApi");

+0

這確實爲我工作,謝謝!!!!!! – Nigel 2014-03-04 16:01:04

相關問題