在循环TimeoutError中启动多个select查询时出现错误:ResourceRequest超时

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在循环TimeoutError中启动多个select查询时出现错误:ResourceRequest超时相关的知识,希望对你有一定的参考价值。

  • 我正在使用nodeJs Express Framework。
  • 我正在使用带有sequelizejs库的mysql数据库并使用查询来检索数据。

当我为近50,00,000条记录触发select查询时,我收到超时错误。

我已经完成了服务器超时但没有工作。我已经在sequlizeJs中完成了池方法但是没有用。

function fetchNamesData(req, name) {
    return new Promise((resolve, reject) => {
        const names = req.app.locals.models.names_data;
        names.findAll({
            where: {
                name: name
            },
            order: [['date', 'DESC']],
            limit: 50
        })
            .then(function (dbRes) {
                console.log(dbRes.length);
                resolve(dbRes);
            })
            .catch(function (dbErr) {
                console.log(dbErr);
                return reject(dbErr);
            });
    });
}

allNames.forEach(element => {
//console.log(element.dataValues.name);
fetchNamesData(req, element.dataValues.name).then((dbRes) => {
//here I will have all the records
}).catch((dbErr) => { console.log(dbErr) });

var allNames = {有近7000个名字}现在我迭代这个obj,每个名字在数据库中都有50条记录我希望得到所有记录,如50 * 7000 = 3,50,000。

答案

在你的情况下会发生什么:

循环遍历7000个名称并同时在mySql中命中7000个查询,而mysql将创建队列以同时执行7000个查询,从而导致计算机上的负载。您可以更新配置以处理此类负载OR

解决方法:尝试在每个查询中放置一些超时b / w,这样您就可以获取更多记录,

allNames.forEach(element => {
    setTimeout(() => { // <----------- HERE -------------
        fetchNamesData(req, element.dataValues.name).then((dbRes) => {
            //here I will have all the records
        }).catch((dbErr) => {
            console.log(dbErr)
        });
    },500); // <----------- HERE -------------
}); 
另一答案

我找到了解决方案 - 删除不需要的console.log()和 - 您的硬件配置也取决于它的超时错误。 - 当查询触发时不启动或运行任何其他工作,它将导致超时错误[当有多个crud操作正在进行时]。 - 当在where子句中使用特定字段时,也为表字段提供索引。

以上是关于在循环TimeoutError中启动多个select查询时出现错误:ResourceRequest超时的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize:TimeoutError:ResourceRequest 超时

LAN 上的服务器/客户端应用程序 TimeoutError

Rails应用程序中的Redis :: TimeoutError

在给定的multiprocessing.connection.Listener.accept()给定时间后引发TimeOutError

aiohttp asyncio.TimeoutError 从无使用 ClientSession

AWS RDS / EC2:TimeoutError:Knex:获取连接超时。游泳池可能已满