在循环内启动多个选择查询时出现错误TimeoutError:ResourceRequest超时

时间:2019-04-07 10:26:55

标签: mysql node.js localhost sequelize.js

  • 我正在使用nodeJs Express Framework。
  • 我正在将mysql数据库与sequ​​elizejs库一起使用,并使用查询来检索数据。

当我触发将近50,000,000条记录的选择查询时,我收到超时错误。

我已经完成服务器超时,但是没有用。 我已经在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。

2 个答案:

答案 0 :(得分:0)

您的情况是:

遍历7000个名称,同时在mySql中命中7000个查询,mysql将创建队列以同时执行7000个查询,这会导致机器负载。您可以更新配置以处理此类负载,或者

解决方案:尝试为每个查询添加一些超时时间,这样您将可以获取更多记录,

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 -------------
}); 

答案 1 :(得分:0)

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