Android Studio连接MySQL数据库超时解决办法(真机调试)
此篇文章建立在自己懂得连接数据库需要引入jar包等一系列操作后,连接数据库的代码也懂得怎么写(比如ip为自己电脑ip,端口、数据库名、用户名、密码等根据自己实际情况更改),仅仅适于当连接数据库的代码找不到毛病,但又连不上的情况。
又或者说,在Android studio内部虚拟机调试时,可以正常连接数据库,可是真机调试死活连不上的情况。
完整报错如下:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
连接数据库核心代码如下:
Connection cn=DriverManager.getConnection(“jdbc:mysql://192.168.X.XXX:3306/financing”,“root”,“root”)
我遇到这个问题时,网上也搜了很多,比较多的说法有:
- 将url末尾添加?autoReconnect=true&useSSL=false&…,不好使
- 关闭网络防火墙,不好使
- 更改MySQL配置文件my.ini,添加
wait_timeout=604800 interactive_timeout=31536000
两行代码,重启MySQL服务,不好使 AndroidManifest.xml
文件设置允许网络连接,即添加以下代码:
<uses-permission android:name="android.permission.INTERNET" />
,重要但不够- 等等不一一列举了,若你在进行了如此多的操作还不能连接的话,别放弃,请往下看(请确保你的MySQL服务是打开的)
以上是我踩得坑,搞了很久,很迷惑,到底哪里出了问题呢?
重要:
一、MySQL默认不允许远程连接,需自己手动更改权限
- 进入数据库
mysql -u root -p
use mysql;
grant all privileges on *.* to '你的数据库用户名'@'%' identified by '你的密码' with grant option;
%表示允许任何ipflush privileges;
- 可以使用以下语句验证远程连接:
mysql -u用户名 -p密码 -h 192.168.XXX.XXX
,注意u和p后面没有空格。
二、AndroidManifest.xml
文件添加以下四行代码
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
将上述重要的两步检查完后,检查自己手机与电脑是否连接的同一网络,不同网络也不能连接数据库。(比如电脑连接的wifi,手机使用流量),再重新运行代码测试是否可以连接。本人做到这一步就可以了,xml新增四行代码的详情在此不做深究,本人不搞安卓,帮别人调试时出现的问题。耗费了我大量的精力解决,不记录一下对不起自己。
若看到此时的你还无法连接,请反复检查url、数据库名、用户名、密码等是否正确,MySQL服务是否启动,MySQL是否允许远程连接,xml文件是否更改。确保没问题后再尝试网络上的其他办法,比如关闭网络防火墙,更改build.gradle
文件等。若还不行,请尝试打开自己电脑的移动热点,手机连接自己电脑的移动热点。
若还还还不行,请断开真机0.0,用虚拟机调试一下试试。(若更改配置文件记得重启服务生效)
new Thread(new Runnable() {
@Override
public void run() {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("1连接数据库ing");
Connection cn= DriverManager.getConnection("jdbc:mysql://192.168.X.XXX:3306/financing","root","root");
System.out.println("2连接数据库ing");
String sql="select username from user";
Statement st=(Statement)cn.createStatement();
ResultSet rs=st.executeQuery(sql);
System.out.println("3连接数据库ing");
cn.close();
st.close();
rs.close();
System.out.println("连接数据库成功");
} catch (ClassNotFoundException e) {
System.out.println("连接数据库失败");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}).start();