Node.js中如何正确使用mysql包终止数据库连接?
是否需要关闭MySQL连接?
是的,必须妥善管理数据库连接的生命周期:
- 长期保留未使用的连接会占用数据库服务器的连接资源,一旦达到连接上限,后续请求将无法建立新连接。
- 但单个连接不能在请求回调内直接关闭——你的API存在多个接口,其他请求可能还需要复用该连接,提前关闭会导致后续请求报错。
你之前调用connection.end()报错,大概率是调用时机错误:比如在查询的异步回调完成前就执行了end,或者连接关闭后仍有请求尝试使用已终止的连接。
正确的连接管理方式
方式1:单个连接的正确关闭(仅适合低并发场景)
如果坚持使用单个连接,应在应用退出时统一关闭,而非每个请求后关闭,同时要处理连接异常:
// 创建连接 const connection = mysql.createConnection({ host: host, user: user, password: password, database: database, multipleStatements: true, }); // 监听连接错误,异常断开时尝试重连 connection.on('error', (err) => { console.error('数据库连接错误:', err); if (err.code === 'PROTOCOL_CONNECTION_LOST') { reconnect(); // 自定义重连逻辑,重新创建连接 } else { throw err; } }); // 接口示例 router.get("/getAll", function (_, res) { connection.query("SELECT * FROM admin", (error, data) => { if (error) { return res.status(500).json({ status: 500, message: error.message }); } res.status(200).json({ status: 200, data, }); }); }); // 应用退出时关闭连接 process.on('SIGINT', () => { connection.end((err) => { if (err) { console.error('关闭连接失败:', err); process.exit(1); } console.log('数据库连接已关闭'); process.exit(0); }); });
方式2:使用连接池(推荐,适合API高并发场景)
连接池会自动管理连接的创建、复用与释放,无需手动操作单个连接,是Node.js中数据库连接管理的最佳实践:
// 创建连接池 const pool = mysql.createPool({ host: host, user: user, password: password, database: database, multipleStatements: true, connectionLimit: 10, // 最大连接数,根据数据库配置调整 waitForConnections: true // 连接不足时等待分配 }); // 接口示例:每次请求自动从池内获取/释放连接 router.get("/getAll", function (_, res) { pool.query("SELECT * FROM admin", (error, data) => { if (error) { return res.status(500).json({ status: 500, message: error.message }); } res.status(200).json({ status: 200, data, }); }); }); // 应用退出时关闭连接池 process.on('SIGINT', () => { pool.end((err) => { if (err) { console.error('关闭连接池失败:', err); process.exit(1); } console.log('数据库连接池已关闭'); process.exit(0); }); });
连接池的优势
- 避免频繁创建/销毁连接的性能损耗。
- 自动控制连接数量,防止数据库连接过载。
- 每个请求使用独立连接,不会出现单个连接被多请求阻塞的问题。
内容的提问来源于stack exchange,提问作者Ali Bahaari
相关产品推荐
相关产品推荐

