SequelizeConnectionAcquireTimeoutError:操作超时

问题描述 投票:0回答:1

请理解这种情况,我需要帮助来解决这个问题。

如果有人能帮助我找出问题并解决,我将奖励他 5rrr,最高可达 15 美元。

我正在使用一个使用mysql和sequelize db的后端。大约六个月以来,它运行良好。供您参考,我正在使用具有以下资源的共享托管服务器。

我的服务器的统计数据在这里。

Physical Memory Usage 3.04 GB / 6 GB (50.68%)
--
Entry Processes 137 / 400 (34.25%)
Disk Usage 287.92 GB / 1,000 GB (28.79%)
MySQL® Disk Usage 189.78 GB / 901.86 GB (21.04%)
Bandwidth 28.32 GB / ∞
Addon Domains 0 / ∞
Subdomains 3 / ∞
Alias Domains 0 / ∞
Email Accounts 1 / ∞
Mailing Lists 0 / ∞
Autoresponders 0 / ∞
Forwarders 0 / ∞
Email Filters 0 / ∞
MySQL® Databases 4 / ∞
CPU Usage0 / 100 (0%)
I/O Usage0 bytes/s / 200 MB/s (0%)

所有其他功能都工作正常。但是每当我在 24 小时、48 小时或最多 72 小时后添加这些查询时,服务器就会出现以下错误:

SequelizeConnectionAcquireTimeoutError:操作超时

在ConnectionManager.getConnection(/home/truecall/nodevenv/public_html/truecaller/14/lib/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:206:15)

这是我的

package.json
文件

{
  "name": "truecaller",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./app.js",
    "start:dev": "nodemon ./app.js"
  },
  "dependencies": {
    "agentkeepalive": "^4.5.0",
    "axios": "^0.19.2",
    "body-parser": "^1.20.2",
    "cookie-parser": "^1.4.6",
    "express": "^4.18.2",
    "form-data": "^4.0.0",
    "joi": "^17.11.0",
    "moment": "^2.29.4",
    "morgan": "^1.9.1",
    "multer": "^1.4.5-lts.1",
    "mysql2": "^2.3.3",
    "nodemailer": "^6.9.7",
    "rootpath": "^0.1.2",
    "sequelize": "^6.35.1",
    "sequelize-auto": "^0.8.8"
  }
}

这是运行此路线后的搜索文件我收到此错误:

const { getNetwork } = require("./network.service");
const sequelize = require("../_helpers/sequelize");
module.exports = {
  getAll,
  getById,
  search,
  update,
  delete: _delete,
  getContactDetailsFromDatabase1,
  getContactDetailsFromDatabase2,
};
async function getAll() {
  return new Promise(async (resolve, reject) => {
    reject({
      status: false,
      message: "GET is not allowed",
    });
  });
}

async function getById(id) {
  return new Promise(async (resolve, reject) => {
    reject({
      status: false,
      message: "GET_BY_ID is not allowed",
    });
  });
}

// async function search(params) {
//   return new Promise(async (resolve, reject) => {
//     // return getContactDetailsFromDatabase2(params)
//     //   .then((data) => {
//     //     resolve(data);
//     //   })
//     //  .catch(async (err) => {
//         resolve({
//           status: false,
//           db: "db2",
//           message: "Not Data Found",
//           appuser: false,
//           appuserresults: null,
//           results: null,
//           location_info: "No Network" // await getNetwork(params),
//         });
//     //  });
//   });
// }

async function search(params) {
  return new Promise(async (resolve, reject) => {
    return checkifAppUser(params).then((data) => {
      resolve(data)
    }).catch(() => {
      getContactDetailsFromDatabase1(params).then((data) => {
        resolve(data)
      }).catch((err) => {
        getContactDetailsFromDatabase2(params).then((data) => {
          resolve(data)
        }).catch(async (err) => {
          resolve({
            status: false,
            db: "db2",
            message: "Not Data Found",
            appuser: false,
            appuserresults: null,
            results: null,
            location_info: await getNetwork(params),
          });
        })
      })
    })
  });
}

async function update() {
  return new Promise(async (resolve, reject) => {
    reject({
      status: false,
      message: "PUT is not allowed",
    });
  });
}

async function _delete() {
  return new Promise(async (resolve, reject) => {
    reject({
      status: false,
      message: "DELETE is not allowed",
    });
  });
}

async function checkifAppUser(params) {
  return new Promise(async (resolve, reject) => {
    try {
      const [results, metadata] = await sequelize.query(
        `select users.*, countries.name, countries.iso2, filtered_contacts.name_check as spam_count from users  join countries on users.country_id = countries.id join filtered_contacts on filtered_contacts.mobile_number = users.mobile_number where users.mobile_number = ${params.mobile_number}`
      );

      if (results.length > 0) {
        
        resolve({
          status: true,
          db: "db1",
          appuser: true,
          message: "Contact found successfully",
          appuserresults: results[0],
          results:null,
          network: await getNetwork(params),
        });
      } else {
        reject();
      }
    } catch (error) {
      reject();
    }
  });
}

async function getContactDetailsFromDatabase1(params) {
  return new Promise(async (resolve, reject) => {
    try {
      const [results, metadata] = await sequelize.query(
        `![Capture](https://github.com/sequelize/sequelize/assets/72066902/bb024ea5-9bce-409d-87e6-c1fc76d89bbf)`
      );

      if (results.length > 0) {
        resolve({
          status: true,
          db: "db1",
          appuser: false,
          message: "Contact found successfully",
          appuserresults: null,
          results: {
            filtered_contact_id: results[0].filtered_contact_id,
            filtered_contact_name: results[0].filtered_contact_name,
            spam_check:
              results[0].spam_check == null ? 0 : results[0].spam_check,
            suggested_names: await removeAttributes(results.reverse()),
          },
          location_info: await getNetwork(params),
        });
      } else {
        reject();
      }
    } catch (error) {
      reject();
    }
  });
}

async function getContactDetailsFromDatabase2(params) {
  return new Promise(async (resolve, reject) => {
    const [results, metadata] = await sequelize.query(
      `SELECT id , personName from truecall_central_caller_database.contactsdb where nationalNumber = '${params.mobile_number}' and countryId = (SELECT id from countries WHERE countries.iso2 = '${params.iso2}') LIMIT 1`
    );
    if (results.length > 0) {
      resolve({
        status: true,
        db: "db2",
        appuser: false,
        message: "Contact found successfully",
        appuserresults: null,
        results: {
          filtered_contact_id: results[0].id,
          filtered_contact_name: results[0].personName,
          spam_check: 0,
          suggested_names: [
            {
              suggested_name: results[0].personName,
              count: 1,
            },
          ],
        },
        location_info: await getNetwork(params),
      });
    } else {
      const [results, metadata] = await sequelize.query(
        `SELECT id , personName from truecall_central_caller_database.contactsdb2 where nationalNumber = '${params.mobile_number}' and countryId = (SELECT id from countries WHERE countries.iso2 = '${params.iso2}') LIMIT 1`
      );
      if (results.length > 0) {
        resolve({
          status: true,
          db: "db2",
          appuser: false,
          message: "Contact found successfully",
          appuserresults: null,
          results: {
            filtered_contact_id: results[0].id,
            filtered_contact_name: results[0].personName,
            spam_check: 0,
            suggested_names: [
              {
                suggested_name: results[0].personName,
                count: 1,
              },
            ],
          },
          location_info: await getNetwork(params),
        });
      } else {
        const [results, metadata] = await sequelize.query(
          `SELECT id , personName from truecall_central_caller_database.contactsdb3 where nationalNumber = '${params.mobile_number}' and countryId = (SELECT id from countries WHERE countries.iso2 = '${params.iso2}') LIMIT 1`
        );
        if (results.length > 0) {
          resolve({
            status: true,
            db: "db2",
            appuser: false,
            message: "Contact found successfully",
            appuserresults: null,
            results: {
              filtered_contact_id: results[0].id,
              filtered_contact_name: results[0].personName,
              spam_check: 0,
              suggested_names: [
                {
                  suggested_name: results[0].personName,
                  count: 1,
                },
              ],
            },
            location_info: await getNetwork(params),
          });
        } else {
          reject();
        }
      }
    }
  });
}





async function removeAttributes(arr) {
  await arr.forEach((obj) => {
    delete obj.filtered_contact_id, delete obj.filtered_contact_name;
    delete obj.spam_check;
  });
  return arr;
}

Sequelize 连接文件

db.js

const { Sequelize } = require("sequelize");
const config = require("../../config.json");

const { database, user, password } = config.database;

const sequelize = new Sequelize({
    host:"localhost",
    database:database, 
    user:user, 
    password:password, 
    dialect: "mysql",
    logging: false,
      pool: {
        max: 1000,
        min: 10,  
        acquire: 30000,
        idle: 1000
      }
});

module.exports = sequelize;

我检查了 mysql 进程列表,它没有挂起的进程或查询。

我测试了所有查询,它的执行时间约为 0.0035

nodeJS 应用程序拥有约 200 万用户,每小时的搜索查询请求约为 100 万个。

我们已经被困在这里两个多月了。这里有人可以帮助我们吗?您可以询问更多信息,我会提供。谢谢

javascript mysql node.js asynchronous sequelize.js
1个回答
0
投票

经过一段时间终于解决了这个问题。我已经从我的代码中删除了sequilize并使用了mysql2连接池。

sequilize 的主要问题是存在原始查询,而对于原始查询,它不会关闭连接。

第三个问题与 mysql 服务器有关。杀死空闲线程的时间太长。即28100秒。将其设置为 60 秒后,所有问题都消失了,现在工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.