mysql2调用connection.end()后报Pool is closed错误问题咨询
问题排查与解决方案
报错根因
你遇到的Pool is closed错误是因为混淆了连接池实例和单连接实例的操作逻辑:
- 你在
config.js中通过mysql.createPool()创建的是连接池实例,不是单次数据库连接,全局只需要初始化一次,服务运行期间要保持实例可用。 - 你在
route.js中调用的connection.end()是直接销毁整个连接池,第一次请求执行完成后连接池就被关闭了,第二次请求自然无法从已经销毁的池子里获取连接,触发报错。
连接释放规则说明
要不要手动调用连接关闭方法,分两种场景:
- 若使用
mysql.createConnection()创建单条数据库连接:使用完成后需要手动调用end()方法关闭连接,避免连接资源泄露。 - 若使用
mysql.createPool()创建连接池(也就是你当前的用法):- 绝对不要在每次请求结束后调用全局的
connection.end(),这个方法仅用于服务关停时统一销毁整个连接池。 - 你当前用的
connection.query()快捷写法,mysql2内部会自动完成「从池子里取连接->执行SQL->归还连接到池子」的全流程,不需要你做任何手动释放操作。 - 如果你是手动调用
getConnection()获取的连接,使用完成后调用connection.release()归还连接到池子即可,不要调用end()。
- 绝对不要在每次请求结束后调用全局的
代码修复方案
直接删除route.js中await connection.end();这一行即可,其余逻辑不需要调整。
小提示:你当前把连接池实例命名为
connection容易产生语义混淆,建议改名为dbPool之类的名称,避免后续误操作。
内容的提问来源于stack exchange,提问作者Hussein Mohamed
相关产品推荐
相关产品推荐

