今天做毕业设计时,在前端业务中向后台请求用户数据时,每当请求次数超过五次,及以上时,总会卡死,于是,用简单的console判断代码停止位置,发现每次运行到pool.getConnection时第五次连接查询就会卡住,如图

五次运行停1

图一

五次运行停2

图二

于是乎就感觉是由于前次连接时的数据库连接没有释放的原因导致的,于是,在cmd中查看mysql的连接情况

1
mysql > mysqladmin -uroot -p processlist

再实验前端的请求时,数据库的连接情况

没有连接请求时
没有连接请求

第一次请求时
第一次请求时

第二次请求时
第二次请求时

第五次请求时
第五次请求时

于是乎,得知了每一次请求时,后台的代码中总有两个数据库查询没有释放连接,从而导致,程序的中断

那接下来来检查一下代码:

简略的写,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var getAlluserTotalPromise = function () {
var promise2 = new Promise(function (resolve, reject) {
pool.getConnection(function (err, connection) {
if (err) {
reject(result)
}
connection.query($sql.userCenter.getuserTotal, [], (err, result) => {
if (err) {
connection.release()
reject(result)
} else {
resolve(result)
}
})
})
})
return promise2
}

通过走查发现,我们在执行if-else逻辑时,对于else时的流程中忘记添加数据库释放了,以及后来采用了新的方式是否数据库连接

1
pool.releaseConnection(connection)

于是我们就将代码改为了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var getAlluserTotalPromise = function () {
var promise2 = new Promise(function (resolve, reject) {
pool.getConnection(function (err, connection) {
if (err) {
reject(result)
}
connection.query($sql.userCenter.getuserTotal, [], (err, result) => {
if (err) {
// 修改位置
reject(result)
pool.releaseConnection(connection)
} else {
// 修改位置
resolve(result)
pool.releaseConnection(connection)
}
})
})
})
return promise2
}

之后我们再一遍遍发送请求,查看数据库的连接情况,发现这时候数据库的连接释放就正常了

正常请求时
正常请求时

就把今天的Bug解决了,路漫漫,以后还会多着呢,也算是自己的粗心大意导致的,希望以后解决问题的能力更加厉害有所提升,节约时间