Получение ошибки при запуске запроса множественного выбора внутри цикла TimeoutError: истекло время ожидания ResourceRequest - PullRequest
2 голосов
/ 07 апреля 2019
  • Я использую nodeJs Express Framework.
  • Я использую базу данных mysql с библиотекой sequelizejs и использую запросы для извлечения данных.

Я получаю ошибку тайм-аутакогда я запустил запрос на выборку для почти 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 именами}, теперь я повторяю этот объект и каждое имя, имеющее 50 записей в базе данных, я хочу получить эту всю записькак 50 * 7000 = 3,50,000.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Я нашел решение, как- удалите ненужные console.log () и- Также ваша аппаратная конфигурация зависит от нее из-за ошибки таймаута- Когда запрос запускается, не запускайте и не выполняйте никакую другую работу, это приведет к ошибке тайм-аута [когда происходит многократная операция crud].- Также укажите индекс для поля таблицы, когда определенное поле будет использоваться в предложении where.

0 голосов
/ 08 апреля 2019

В вашем случае происходит следующее:

Цикл по 7000 именам и одновременное выполнение 7000 запросов в mySql, и 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 -------------
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...