node-mysql中如何正确使用连接池?

遇到的问题:

自己做的一个多用户博客项目上线后,隔断时间就无法访问数据库了。查了一下原因,似乎是因为用的是直连,长时间未访问后,连接被关闭,就无法访问数据库了。

现在的想法:

所以现在打算是用连接池。首先是创建的数据库连接的问题,看了很多文章,使用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('数据库发生未知错误')
                    }
                })
            }
        })
    })
阅读 1.9k
1 个回答

node-mysql文档是这么写的:

Connections are also cycled round-robin style, with connections being taken from the top of the pool and returning to the bottom.

因此推测一个connection用完之后,它马上被放到池的底部,后续的查询用不到它,因此变成sleep状态。你测试时候再多进行几次查询,直到将池里面的连接都耗尽之后再观察一下,应该会发现之前处于sleep的connection被复用了。
另外我认为node-mysql这种类型的库在连接池的实现已经非常完善了,无需自己再去造轮子,例如你说的自己再去写一个定时器。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题