Node-MySQL2连接池未释放空闲连接问题排查及配置咨询
MySQL连接池问题排查与解答
1. 代码里哪些问题会导致连接没释放?
这大概率是连接回收逻辑出了问题,常见的坑有这几个:
- 异常场景下没释放连接:手动用
pool.getConnection()拿连接后,只在try里处理业务,忘了在finally里调用connection.release()。一旦代码抛异常,连接就会被占着不放,变成闲置但回不去池里的死连接。比如这种错误写法:async function getUsers() { const conn = await pool.getConnection(); try { return await conn.query('SELECT * FROM users'); } catch (err) { throw err; // 这里抛错后,conn没被释放 } } - 用错了关闭连接的方法:把
connection.release()(放回连接池)写成了connection.end()(直接销毁连接),这样池里的可用连接会越来越少,只能不断新建连接,最后堆一堆闲置的死连接。 - 未完成的事务/卡住的查询:如果有事务没提交也没回滚,或者某个查询因为锁、数据量大卡住,连接会一直被占用,时间久了就变成闲置连接,没法被复用。
2. 连接池只在服务启动时创建复用,这做法对吗?
这绝对是正确的!连接池的核心就是全局单例、启动时初始化、全程复用,这样能避免频繁创建销毁数据库连接的巨大开销。mysql2的连接池本身就是线程安全的,一个单实例足够撑住所有请求的连接复用,要是每次请求都新建池,那才会直接把数据库的连接数上限炸穿。
3. 把connectionLimit从10改成100会出问题吗?
得看两个关键点:
- 数据库的最大连接数限制:先查Digital Ocean托管MySQL的
max_connections配置(默认一般是151左右),如果改到100,得留够余量给管理员操作或者其他服务,别直接顶到数据库的上限,不然会触发Too many connections的错误。 - 应用的实际并发需求:如果应用并发本来就不高,100的连接数纯纯是浪费,大部分连接会一直闲置;但如果并发确实高,10个连接不够用,改到100是可行的,但要注意:
- 盯着点连接的实际使用率,要是大部分时间闲置率很高,说明调这么高没必要。
- 每个数据库连接都占内存,连接数太高会增加数据库的内存负载,反而拖慢数据库性能。
内容的提问来源于stack exchange,提问作者dmikester1
相关产品推荐
相关产品推荐

