如何解决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
相关产品推荐
相关产品推荐

