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

排查java.sql.SQLNonTransientConnectionException数据库连接失败问题

问题排查方案:java.sql.SQLNonTransientConnectionException 连接失败

1. Android环境下localhost的错误使用

你的连接URL里用了localhost,在Android设备/模拟器中,localhost指向的是设备自身,而非你的电脑上的MySQL服务器:

  • 若使用模拟器,将localhost替换为10.0.2.2(Android模拟器映射宿主机的默认地址)
  • 若使用物理设备,确保设备与电脑在同一局域网,用电脑的局域网IP(如192.168.x.x)替换localhost

2. MySQL服务器的远程连接权限

默认MySQL的root用户仅允许本地连接,需授权远程访问:
登录MySQL执行以下SQL:

GRANT ALL PRIVILEGES ON daily_db.* TO 'root'@'%' IDENTIFIED BY 'Prueb@1';
FLUSH PRIVILEGES;

注意:生产环境不要用%(允许所有IP),替换为你的设备IP更安全

3. Android主线程网络限制

如果micontroler()方法在主线程调用(比如onCreate中直接调用),Android会阻止该网络操作——主线程不允许执行耗时任务。必须将JDBC操作放到子线程,示例:

new Thread(new Runnable() {
    @Override
    public void run() {
        micontroler();
    }
}).start();

4. 依赖与驱动问题

确认build.gradle中已添加MySQL JDBC驱动依赖:

dependencies {
    implementation 'mysql:mysql-connector-java:8.0.33'
}

你的代码中已使用MySQL 8.0+的驱动类com.mysql.cj.jdbc.Driver,需确保依赖正确引入。

5. 数据库服务器状态与防火墙

  • 确认MySQL服务正在运行
  • 检查电脑防火墙是否开放3306端口,允许Android设备访问

6. 代码中的其他优化点

  • controler类是AppCompatActivity,但onCreate中实例化new controler()会导致Activity重复创建,直接调用静态方法micontroler()即可
  • 已声明但未使用的Resultset rs可删除
  • 数据库操作后需关闭连接、Statement,避免资源泄漏:
try {
    conexion = DriverManager.getConnection(url,usuario,password);
    statement = conexion.createStatement();
    statement.executeUpdate("INSERT INTO USUARIOS(EMAIL,NOMBRES,APELLIDOS,APODO,FECHA_NACIMIENTO) VALUES ('Teste','TESTn','TESTa','TESTp','14/06/22')");
} catch (SQLException e) {
    e.printStackTrace(); // 不要直接抛RuntimeException,打印完整堆栈便于排查
} finally {
    try {
        if(statement != null) statement.close();
        if(conexion != null) conexion.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

内容的提问来源于stack exchange,提问作者Jhon Edwin Rodríguez Ceron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:53:17