You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:17:34