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可能不在服务器的允许访问列表中。
解决:- 检查Ubuntu服务器的ufw防火墙:执行
sudo ufw allow 3306开放端口,再执行sudo ufw reload生效。 - 登录云服务商控制台,在安全组规则中添加入站规则,允许3306端口的TCP连接(测试阶段来源可设为
0.0.0.0/0,生产环境建议限制具体IP)。
- 检查Ubuntu服务器的ufw防火墙:执行
MySQL绑定地址限制
MySQL默认可能仅绑定127.0.0.1(仅允许本地访问),外部设备无法建立连接。
解决:- 编辑MySQL配置文件(通常路径为
/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),将bind-address修改为0.0.0.0。 - 重启MySQL服务:
sudo systemctl restart mysql
- 编辑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
相关产品推荐
相关产品推荐

