遇到的问题:
自己做的一个多用户博客项目上线后,隔断时间就无法访问数据库了。查了一下原因,似乎是因为用的是直连,长时间未访问后,连接被关闭,就无法访问数据库了。
现在的想法:
所以现在打算是用连接池。首先是创建的数据库连接的问题,看了很多文章,使用conn.release()可以释放连接,但是我在mysql库里用show processlist;命令查询的时候,显示创建的连接进入了sleep状态,如果再进行多次请求后,也只是会创建更多的连接,并不会启用之前进入sleep的连接,这种状态的连接是否占用资源呢?。只有conn.destroy()是符合我的想法的,连接查询完毕时候关闭连接,返还连接资源,在mysql里查询连接使用状态是看不到的,但又看到这样又违背了使用连接池的目的(避免频繁地创建和关闭数据库连接)
如果使用连接池的话,还会出现之前提到的问题(长时间未访问数据库后,会无法再次访问数据库)吗?是否需要设置一个定时器,定时简单请求一次保证数据库能够访问?
我的代码
目前是下面这样封装的数据库请求
return new Promise((resolve, reject) => {
pool.getConnection(function(conn_err, connection){
// 连接错误
if(conn_err) reject(conn_err)
else {
connection.query(sql, data, (query_err, result) => {
// 释放数据库连接
connection.destroy()
// 数据库查询错误
if(query_err) reject(query_err)
else if (result){
dosometing...
}
else {
console.log('数据库发生未知错误')
reject('数据库发生未知错误')
}
})
}
})
})
node-mysql文档是这么写的:
因此推测一个connection用完之后,它马上被放到池的底部,后续的查询用不到它,因此变成sleep状态。你测试时候再多进行几次查询,直到将池里面的连接都耗尽之后再观察一下,应该会发现之前处于sleep的connection被复用了。
另外我认为node-mysql这种类型的库在连接池的实现已经非常完善了,无需自己再去造轮子,例如你说的自己再去写一个定时器。