【问题标题】:how to solve the "CommunicationsException: Communications link failure" when working with JDBC and android application使用 JDBC 和 android 应用程序时如何解决“CommunicationsException: Communications link failure”
【发布时间】:2013-03-20 16:16:23
【问题描述】:

当我尝试将我的 java 程序连接到服务器时,我得到了这个异常:

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: Communications link 失败,则意味着数据库根本无法访问。这个可以 有以下一种或多种原因:

  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 DB 的 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 { }

【问题讨论】:

  • 我的连接代码:private MySQLConnectivity() { try { Class.forName("com.mysql.jdbc.Driver");连接(); } catch (ClassNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } public void Connect() { try { MySQLConnectivity.Conn = (Connection)DriverManager.getConnection(URL, USER, PASS); } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } 最后 { }

标签: android jdbc


【解决方案1】:

我使用最新版本的 adt 和 mysql-connector-java-5.1.17-bin.jar,这对我有用:

setContentView(R.layout.activity_main)之后将以下代码添加到您的mafile中;

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");

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 2019-11-04
    • 2016-12-12
    • 2016-05-19
    • 1970-01-01
    • 2018-05-14
    • 2021-07-10
    • 2012-11-29
    • 2010-12-31
    相关资源
    最近更新 更多