Android Studio项目连接MySQL数据库服务器失败求助
解决Android Studio连接本地MySQL失败的问题
针对你遇到的java.sql.SQLNonTransientConnectionException: Could not create connection to database server错误,结合纯Java环境可正常连接、Android环境失败的情况,按以下步骤排查修复:
1. 修正MySQL用户权限
你创建的用户'myusr'@'localhost'仅允许从物理机本地登录,但Android模拟器通过10.0.2.2访问物理机MySQL属于远程连接,会被权限拦截。执行以下SQL调整权限:
-- 创建允许从任意地址访问的用户(或指定10.0.2.2更安全) CREATE USER 'myusr'@'%' IDENTIFIED BY 'mypass'; -- 授权该用户访问mydatabase的所有权限 GRANT ALL PRIVILEGES ON mydatabase.* TO 'myusr'@'%'; FLUSH PRIVILEGES;
2. 调整MySQL绑定地址
默认MySQL的bind-address配置为127.0.0.1,仅允许本地访问,模拟器无法连接。修改MySQL配置文件:
- Windows:找到
my.ini(通常在C:\ProgramData\MySQL\MySQL Server X.X) - Linux/macOS:找到
my.cnf(通常在/etc/mysql/)
将bind-address修改为:
bind-address = 0.0.0.0
重启MySQL服务生效。
3. 添加Android网络权限
在AndroidManifest.xml的<manifest>标签内添加网络权限,否则APP无法发起网络请求:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4. 避免主线程执行网络操作
Android从API 23开始禁止主线程执行网络操作,你的connect()方法在按钮点击事件(主线程)中调用,即使连接成功也会触发异常。改用异步线程执行:
show.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { CompletableFuture.runAsync(() -> { try { Connection conn = connect(); runOnUiThread(() -> text.setText("连接成功")); conn.close(); } catch (SQLException e) { runOnUiThread(() -> errorText.setText(e.getMessage())); e.printStackTrace(); } }); } });
5. 适配MySQL JDBC驱动版本
Android对高版本MySQL JDBC驱动(如8.x)兼容性较差,建议使用5.1.x版本。在app/build.gradle的dependencies中添加:
implementation 'mysql:mysql-connector-java:5.1.49'
若坚持使用8.x版本,需额外配置驱动类及时区:
// 在connect()方法开头添加 Class.forName("com.mysql.cj.jdbc.Driver"); // 修改URL String url = "jdbc:mysql://10.0.2.2:3306/mydatabase?serverTimezone=UTC";
6. 检查主机防火墙设置
确保物理机防火墙允许3306端口的入站连接,否则模拟器无法访问物理机的MySQL服务。
内容的提问来源于stack exchange,提问作者Crenaul
相关产品推荐
相关产品推荐

