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

Android Studio开发移动应用时JDBC连接MySQL数据库失败问题

安卓应用直连MySQL失败排查方案

核心问题1:连接地址指向错误

你代码中配置的127.0.0.1是安卓设备/模拟器自身的回环地址,不是运行MySQL服务的开发电脑地址,自然无法建立连接。

  • 若使用安卓官方模拟器调试:将地址中127.0.0.1替换为10.0.2.2,这是模拟器预留的、映射到宿主机本地回环的特殊IP
  • 若使用真机调试:将地址替换为开发电脑在当前局域网的实际IP(如192.168.3.12),同时保证手机与电脑连接同一局域网

注意:直连MySQL仅适合本地调试使用,正式上线的应用绝对不能用这种架构,必须通过服务端封装HTTP/HTTPS接口对外提供数据,否则会出现数据库账号泄露、服务被攻击、权限失控等严重安全问题。

核心问题2:在主线程执行网络操作违反系统限制

安卓从4.0版本开始强制禁止在UI主线程执行网络请求,你把JDBC连接、查询逻辑全部写在onCreate主线程生命周期方法中,会直接触发NetworkOnMainThreadException导致连接中断。

  • 所有数据库连接、查询逻辑必须放到子线程执行,可使用原生线程、线程池实现,禁止在主线程做耗时/网络操作
  • 数据查询完成后如果需要更新界面控件,必须切回主线程执行
    参考修正代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tasks);
    // 其他控件初始化逻辑...

    // 数据库操作放到独立子线程执行
    new Thread(() -> {
        Connection connection = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 替换为正确的连接地址
            String dbUrl = "jdbc:mysql://10.0.2.2:3306/healthdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT";
            connection = DriverManager.getConnection(dbUrl, "root", "phantom");
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT id FROM patient");
            while (rs.next()) {
                Log.i("DB_QUERY_RESULT", "患者ID:" + rs.getInt("id"));
            }
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 操作完成必须关闭连接,避免资源泄漏
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

核心问题3:缺少必要的权限与配置

安卓应用发起网络请求需要提前声明权限,否则会被系统直接拦截:

  1. 打开AndroidManifest.xml文件,在<application>标签同级位置添加以下权限声明:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  1. 若项目targetSdkVersion为28及以上(Android 9+),系统默认禁止明文网络传输,需要在<application>标签中添加属性android:usesCleartextTraffic="true",否则本地非加密的数据库连接会被拦截。

核心问题4:MySQL用户远程访问权限未开放

你使用的root用户默认仅允许从数据库所在主机的localhost本地登录,来自模拟器/真机的连接属于远程访问,会被MySQL权限体系直接拒绝。
本地调试阶段可以执行以下SQL开放权限(仅调试用,生产环境禁止这么配置):

-- 允许root用户从任意IP发起连接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'phantom';
FLUSH PRIVILEGES;

执行完成后重启MySQL服务即可。

其他排查项

  • 检查开发电脑的防火墙规则,确认没有拦截3306端口的入站连接,调试阶段可临时关闭防火墙测试
  • 检查MySQL配置文件(Windows为my.ini,Linux/macOS为my.cnf),将bind-address=127.0.0.1配置注释或修改为bind-address=0.0.0.0,允许非本地地址访问
  • 确认引入的JDBC驱动版本与本地安装的MySQL大版本匹配,MySQL 8.x对应8.x版本的Connector/J,不要混用5.x版本驱动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:42:25