排查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
相关产品推荐
相关产品推荐

