使用mysql2 / promise模块,我创建了一个这样的连接池:
import mysql from 'mysql2/promise';
async function getConnection() {
let pool = await mysql.createPool({
connectionLimit: 10,
host:'localhost',
user: 'root',
database: 'customers'
});
return pool.getConnection();
}
export {
getConnection
};
在另一个文件中,我可以像这样访问此功能:
import {getConnection} from '../config/database/mysql';
async function getCustomerAddresses(id){
let conn = await getConnection();
let [rows, fields] = await conn.execute(
`SELECT *
FROM addresses WHERE customer = ?`, [id]);
conn.release();
return rows;
}
在多次调用该函数后,我收到以下错误:
连接太多
我做错了什么?是否有更优雅的方式,所以我不必在每个函数中包含getConnection()调用?
答案 0 :(得分:2)
每次需要新连接时都在创建新池,尽管池最终仍然是GCed连接仍然打开,除非您手动调用.close()
。你应该做的是拥有一个单独的池,它将为你管理连接的生命周期:
import mysql from 'mysql2/promise';
const pool = mysql.createPool(params);
const getConnection = () => pool.getConnection();
export { getConnection }
答案 1 :(得分:0)
根据我的经验,我相信你的问题就是这段代码
conn.release();
在我的情况下,我将其更改为
conn.destroy();
我刚刚阅读了文档,我认为差异在文档中有解释:
游泳池懒洋洋地创建了连接。如果配置池 允许多达100个连接,但只能同时使用5个, 只会建立5个连接。连接也是循环的 循环式,连接从顶部开始 游泳池并返回底部。
而破坏就是这个
这将导致立即终止底层套接字。 另外destroy()保证不再有事件或回调 将触发连接。
希望这有帮助。