首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放Promise.All中的MySQL连接

释放Promise.All中的MySQL连接
EN

Stack Overflow用户
提问于 2019-10-29 02:03:21
回答 1查看 475关注 0票数 2

我想释放由MySQL池提供的连接。在"for“循环中,连接被正确释放,但是如果我使用Promise.All进行异步操作,我有一些未关闭的连接。问题是,片刻之后,我收到错误消息"Too many“,并且我不想增加max_connection数量。

您是否知道,由于任何原因,MySQL连接不能在异步函数中释放?

下面是我如何创建我的池:

代码语言:javascript
复制
dbPool = mysql2.createPool(Object.assign({}, defaultDBConfig, {
            database: 'my_db,
            waitForConnections: true,
            connectionLimit: 10,
            queueLimit: 0,
            multipleStatements: true,
            dateStrings: true
        }));

下面是我使用的函数:

代码语言:javascript
复制
/**
 * @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);
    }));
代码语言:javascript
复制
/**
 * @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;
}

最后,有一个我使用的代码示例,在这种情况下,连接没有被释放:

代码语言:javascript
复制
const elements = [{prop1: 'a'},{prop1: 'b'}];
await asyncForEachPromised(elements, async (element) => {
    await executeQuery(dbPool, 'my query', 'my error message', [element.prop1]);
});

但在这种情况下,它们被正确地释放了:

代码语言:javascript
复制
const elements = [{prop1: 'a'},{prop1: 'b'}];
for (const [,element] of elements.entries()) {
    await executeQuery(dbPool, 'my query', 'my error message', [element.prop1]);
}
EN

Stack Overflow用户

发布于 2019-10-29 02:11:50

你不能这样做。

尝尝这个

代码语言:javascript
复制
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

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58596154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档