You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用通过JDBC连接MySQL数据库失败求助

排查Android JDBC连接MySQL失败的问题

我来帮你一步步排查这个MySQLNonTransientConnectionException的问题,这个错误通常是由几个常见原因导致的,咱们逐个分析:

1. MySQL驱动版本与服务器版本不兼容

你当前使用的com.mysql.jdbc.Driver是适配MySQL 5.x及更早版本的旧驱动,如果你的MySQL服务器是8.0+版本,就会出现连接失败的问题。

解决方法:

  • 更换驱动类为com.mysql.cj.jdbc.Driver
  • 在连接URL中添加时区参数(MySQL 8.0+强制要求),同时按需设置SSL参数:
    String url = "jdbc:mysql://den1.mysql5.gear.host:3306/pedibustest?useSSL=false&serverTimezone=UTC";
    
  • 确保你的依赖库是适配的版本,比如在Gradle中使用MySQL 8.0+的驱动:
    implementation 'com.mysql:mysql-connector-j:8.0.33'
    

2. 网络与端口访问限制

云MySQL服务(比如你用的gear.host)通常会限制外部IP访问3306端口,这是最常见的连接失败原因之一。

排查步骤:

  • 先测试你的Android设备能否访问目标主机的3306端口:可以用电脑的telnet工具执行telnet den1.mysql5.gear.host 3306,如果无法连接,说明端口被防火墙/安全组拦截。
  • 登录你的主机商后台,检查MySQL实例的安全组设置,确保允许你的设备IP(或者暂时放开所有IP测试)访问3306端口。
  • 确认设备的网络环境:比如是否在公司/学校内网,这类网络往往会封锁对外的3306端口,尝试切换到手机流量测试。

3. 连接参数错误

仔细核对你的连接信息,避免拼写错误:

  • 确认用户名pedibustest、密码Aq4T0zWZxf?!完全正确,注意密码中的特殊字符是否需要转义(JDBC一般会自动处理,但可以尝试复制粘贴主机商提供的原始密码)。
  • 检查数据库名称pedibustest是否拼写正确,确保该数据库在服务器上存在。

4. 主线程执行网络操作

你的代码在MySQLHandler的构造函数中直接调用DriverManager.getConnection(),而Android从API 11开始禁止在主线程执行网络操作,这不仅会触发NetworkOnMainThreadException,还可能间接导致连接异常。

解决方法:
把所有网络相关操作(连接、查询)放到子线程中执行,比如修改你的testGetData方法:

public void testGetData() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                String url = "jdbc:mysql://den1.mysql5.gear.host:3306/pedibustest?useSSL=false&serverTimezone=UTC";
                con = DriverManager.getConnection(url, "pedibustest", "Aq4T0zWZxf?!");
                
                String query = "select * from users";
                Statement st = con.createStatement();
                rs = st.executeQuery(query);
                
                while (rs.next()) {
                    Log.i(TAG, rs.getString("user_name"));
                    Log.i(TAG, rs.getString("password"));
                    Log.i(TAG, rs.getString("indirizzo"));
                    Log.i(TAG, rs.getString("nome"));
                    Log.i(TAG, "\n");
                }
                
                // 记得关闭资源,避免内存泄漏
                rs.close();
                st.close();
                con.close();
            } catch (Exception ex) {
                Log.e("MySQLError: ", ex.toString());
            }
        }
    }).start();
}

5. SSL连接配置问题

有些云服务强制要求SSL连接,或者禁止未加密的连接,你可以尝试在URL中明确设置SSL参数:

  • 如果服务器允许非SSL连接:添加useSSL=false
  • 如果服务器强制SSL:添加useSSL=true&requireSSL=true

建议先从驱动版本+连接URL调整和端口访问权限这两个点入手排查,这两个是最常见的原因。

内容的提问来源于stack exchange,提问作者marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:25:04