首页 > 解决方案 > 空闲后带有Node.js初始查询的Mysql需要很长时间才能执行后续查询是即时的

问题描述

我正在使用带有 Node.js 的 React 与 Mysql 8 进行数据库交互。数据库响应良好,应用程序响应良好,一切都按预期工作。但是,如果站点已经空闲了大约 5 分钟并且执行了查询,则返回结果将需要将近一分钟。查询是什么或返回的数据量无关紧要,它可能是 5 行或 1000 行,如果站点处于非活动状态 5 分钟,先前立即返回的查询将缓慢返回。

问题不在于数据库、缓存或表设计。当您记录交互时,Node.js 会立即响应,但会在 sql 查询处暂停(同样,仅在空闲后的第一次)。

Node.js 创建一个由 10 个连接组成的池,这些连接在那里并且处于空闲状态。如果 Node.js 重新启动(空闲 5 分钟后),查询再次是瞬时的,但我相信这是因为 Node.js 在启动时调用了数据库并创建了连接池。开发机器和生产机器上都会发生相同的事件(即使开发机器运行的是旧版本的 Mysql,然后是生产机器,并且从缓存、内存分配等方面的设置不同)。这不是机器进入睡眠模式的问题,因为我们连接到它(开发机器和生产机器)。

如果站点空闲 5 分钟并且查询是在 Mysql Workbench 上手动执行的,它是即时的,但随后再次使用该站点并且正在执行相同的查询并且响应很慢,然后对于任何后续查询(或相同的查询)都是即时的.

在与所有元素进行了数天和数小时的交互之后,我对问题出在哪里感到困惑。Node.js 在查询调用之前快速响应,然后变慢,此后的任何调用都很快。Mysql Workbench 手动查询总是即时的。重新启动 Node.js 服务器(空闲 5 分钟后)将保证即时查询。

下面是我的 Node.js 的配置和查询调用的示例。

const mysql = require("mysql");
const dbConfig = require("../config/DB.config.js");
const chalk = require('chalk');

const connection  = mysql.createPool({
  connectionLimit : dbConfig.CONNECTIONLIMIT,
  host            : dbConfig.HOST,
  user            : dbConfig.USER,
  password        : dbConfig.PASSWORD,
  database        : dbConfig.DB,
  port            : dbConfig.PORT
});

connection.getConnection((err, con) => {
  if (err) {
      if (err.code === 'PROTOCOL_CONNECTION_LOST') {
          console.error('Database connection was closed.');
      }
      if (err.code === 'ER_CON_COUNT_ERROR') {
          console.error('Database has too many connections.');
      }
      if (err.code === 'ECONNREFUSED') {
          console.error('Database connection was refused.');
      }
  }
  if (con) con.release()
  return
})

以下是其中一个模型调用的查询示例:

Users.findByUserNameAndPassword = (username, password, result) => {
  console.log("HAVE ARRIVED AT THE MODEL, BEFORE QUERY");
  const query = `SELECT UserId as id from users WHERE Username = '${username}' `;

  sql.query(query, (err, res) => {
    if (err) {
      result(err, null);
      return;
    }

    if (res.length) {
      console.log("HAVE RECEIVED RESPONSE FROM DB");
.....

“已经到达模型,在查询之前”的日志始终是瞬时的。“HAVE RECEIVED RESPONSE FROM DB”的日志是即时的,除非站点空闲 5 分钟。

我不确定要关注哪个元素。

标签: mysqlnode.jsreactjs

解决方案


推荐阅读