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

Kotlin安卓应用连接Ubuntu云MySQL服务器通信链路失败排查

解决安卓Kotlin应用连接云MySQL的通信失败问题

以下是你可能遗漏的关键检查点:

  • 主线程禁止网络操作
    安卓从API 23开始严格禁止在主线程执行网络请求,你点击按钮直接调用main()函数,其中的数据库连接操作运行在主线程,不仅会导致连接失败,还可能触发ANR(应用无响应)。
    解决:把数据库操作放到子线程,比如用Thread或者协程:

    Button(onClick={
        Thread { main() }.start()
        // 或者用协程(需添加对应依赖):
        // lifecycleScope.launch(Dispatchers.IO) { main() }
    }) {
        Text("Hello")
    }
    

    用协程的话需额外添加依赖:

    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
    
  • 未添加网络权限
    你的AndroidManifest.xml里没有声明网络权限,应用无法发起任何网络请求。
    解决:在<manifest>标签内添加:

    <uses-permission android:name="android.permission.INTERNET"/>
    
  • 云服务器安全组/防火墙未开放3306端口
    虽然Workbench能连接,但安卓设备的公网IP可能不在服务器的允许访问列表中。
    解决:

    1. 检查Ubuntu服务器的ufw防火墙:执行sudo ufw allow 3306开放端口,再执行sudo ufw reload生效。
    2. 登录云服务商控制台,在安全组规则中添加入站规则,允许3306端口的TCP连接(测试阶段来源可设为0.0.0.0/0,生产环境建议限制具体IP)。
  • MySQL绑定地址限制
    MySQL默认可能仅绑定127.0.0.1(仅允许本地访问),外部设备无法建立连接。
    解决:

    1. 编辑MySQL配置文件(通常路径为/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),将bind-address修改为0.0.0.0。
    2. 重启MySQL服务:sudo systemctl restart mysql
  • JDBC URL参数不全
    MySQL 8.0需要指定时区,否则会因时区不匹配导致连接失败;测试阶段可关闭SSL避免证书问题。
    解决:修改URL为:

    val url = "jdbc:mysql://xx.xx.xx.xx:3306/myschema?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true"
    

    allowPublicKeyRetrieval=true用于解决部分场景下公钥获取失败的问题。

  • MySQL用户权限不足
    你的MySQL用户user可能仅拥有本地(localhost)访问权限,无法从外部IP连接数据库。
    解决:登录MySQL执行以下命令:

    GRANT ALL PRIVILEGES ON myschema.* TO 'user'@'%' IDENTIFIED BY 'pass';
    FLUSH PRIVILEGES;
    

    %表示允许该用户从任意IP连接,生产环境建议指定具体IP以提升安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:37:45