我想释放由MySQL池提供的连接。在"for“循环中,连接被正确释放,但是如果我使用Promise.All进行异步操作,我有一些未关闭的连接。问题是,片刻之后,我收到错误消息"Too many“,并且我不想增加max_connection数量。
您是否知道,由于任何原因,MySQL连接不能在异步函数中释放?
下面是我如何创建我的池:
dbPool = mysql2.createPool(Object.assign({}, defaultDBConfig, {
database: 'my_db,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
multipleStatements: true,
dateStrings: true
}));下面是我使用的函数:
/**
* @description Allow to do a generic async forEach loop
* @param {*} array
* @param {*} callback
*/
async function asyncForEachPromised(array, callback) {
await Promise.all(array.map(async (items) => {
await callback(items);
}));/**
* @description ExecuteQuery a query and return an object which contain the result or an error
* @param {*} dbPool Connection pool
* @param {*} query Query to executeQuery
* @param {*} errorMessage Error message to send to the front-end
* @param {*} elements Array of parameter to send in the query
*/
async function executeQuery(dbPool, query, errorMessage, elements) {
const status = {
error: null,
result: null
};
const { error, connection } = await dbPool.getConnection();
if (error) {
console.log(error);
status.error = 'Error when trying to connect to the database.';
} else {
try {
const [rows] = await connection.promise().execute(query, elements);
connection.release();
status.result = rows;
} catch (err) {
console.log(err);
status.error = errorMessage;
}
}
return status;
}最后,有一个我使用的代码示例,在这种情况下,连接没有被释放:
const elements = [{prop1: 'a'},{prop1: 'b'}];
await asyncForEachPromised(elements, async (element) => {
await executeQuery(dbPool, 'my query', 'my error message', [element.prop1]);
});但在这种情况下,它们被正确地释放了:
const elements = [{prop1: 'a'},{prop1: 'b'}];
for (const [,element] of elements.entries()) {
await executeQuery(dbPool, 'my query', 'my error message', [element.prop1]);
}发布于 2019-10-29 02:11:50
你不能这样做。
尝尝这个
Promise.all( arr )
.then( results => //your code with results)
.finally( () => //close connection)
.catch( e => //do what you need )但是..。你真的应该尝试使用连接池。你用的是什么?mysql节点- https://github.com/mysqljs/mysql#pooling-connections
https://stackoverflow.com/questions/58596154
复制相似问题