NodeJS应用中如何正确关闭MySQL连接池?
正确关闭mysql2连接池的方法
你之前在每个请求处理函数里调用pool.end()的做法是错的——连接池的核心作用是复用数据库连接,一旦调用pool.end(),整个连接池会被销毁,所有现有连接都会关闭,后续请求再用连接池自然会报the pool is close错误。
正确的关闭时机
连接池不需要每次请求后都关闭,只需要在以下场景下关闭:
- 应用程序正常退出时(比如收到停止信号、手动终止进程)
- 脚本类应用执行完毕、不再需要数据库连接时
具体实现步骤
在你的Express应用入口文件(比如app.ts或index.ts)中,监听进程的退出信号,在回调里关闭连接池:
import { pool } from './config/db'; // 这里放你的Express应用初始化代码(比如app.listen等) // 监听Ctrl+C触发的SIGINT信号 process.on('SIGINT', async () => { console.log('正在关闭数据库连接池...'); await pool.end(); console.log('连接池已关闭,应用退出'); process.exit(0); }); // 监听服务器部署时的SIGTERM终止信号 process.on('SIGTERM', async () => { console.log('收到终止信号,关闭数据库连接池...'); await pool.end(); console.log('连接池已关闭,应用退出'); process.exit(0); });
关键说明
- 你的
pool是全局单例连接池,整个应用生命周期只需要初始化一次,所有请求共享这个池 - 每次调用
pool.execute()后,mysql2会自动将连接归还到连接池,不需要手动释放 - 只有当整个应用要停止运行时,才需要调用
pool.end()优雅关闭所有连接,避免数据库残留无效连接
内容的提问来源于stack exchange,提问作者best_of_man
相关产品推荐
相关产品推荐

