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

如何解决SELECT操作时出现的Too many connections数据库连接错误

修复MySQL "Too many connections" 错误的正确方案

问题核心原因

你的代码里有几个关键错误,直接导致连接无法正常回收,最终耗尽数据库连接数:

  • 每次调用都新建连接池:mysql.createPool()在函数内部执行,意味着每发起一次数据库请求就会创建一个新的连接池,多个池同时存在会占用大量闲置连接。
  • resolve后代码失效:resolve(rows)执行后,后续的reject('Error')和connection.end()根本不会运行,Promise一旦进入完成状态,后续代码就会被跳过。
  • 连接获取方式错误:pool.promise()返回的是整个连接池的Promise包装器,不是单个连接;而且你用connection.end()会直接关闭整个池,而不是把连接归还回去复用。

修复后的代码示例

第一步:全局初始化连接池

把连接池创建移到函数外面,确保整个应用只使用一个连接池实例:

const mysql = require('mysql2/promise');
// 全局连接池,只初始化一次
const pool = mysql.createPool({
    host: "你的主机地址",
    user: "你的用户名",
    port: 3306,
    database: "你的数据库名",
    password: "你的密码",
    waitForConnections: true,
    connectionLimit: 10, // 这个值别超过数据库最大连接数的1/5左右,151的话设10-20就够
    queueLimit: 0
});

// 封装查询函数
async function queryDatabase(sql) {
    let connection;
    try {
        // 从连接池里拿单个连接
        connection = await pool.getConnection();
        const [rows] = await connection.query(sql);
        return rows;
    } catch (error) {
        console.error('查询出错:', error);
        throw error; // 把错误抛出去让调用方处理
    } finally {
        if (connection) {
            // 把连接归还到池里,供下次复用
            connection.release();
        }
    }
}

第二步:调用查询函数

// 使用示例
queryDatabase('SELECT * FROM your_table')
    .then(rows => {
        console.log('查询结果:', rows);
    })
    .catch(err => {
        // 这里处理查询失败的情况
    });

额外注意事项

  • 永远不要在请求函数内部创建连接池,连接池的核心作用就是复用连接,全局单实例才是正确用法。
  • 释放连接用release(),而不是end():release()是把连接放回池里,end()是直接销毁整个连接池,只有应用关闭时才需要用end()。
  • 合理设置connectionLimit:别贪大,数据库最大连接数151,你设10-20足够应对常规并发,设太大反而会抢占数据库资源。

内容的提问来源于stack exchange,提问作者nikkkushkaaafx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:20:00