Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql with Node.js空闲后的初始查询需要很长时间才能执行,后续查询是即时的_Mysql_Node.js_Reactjs - Fatal编程技术网

Mysql with Node.js空闲后的初始查询需要很长时间才能执行,后续查询是即时的

Mysql with Node.js空闲后的初始查询需要很长时间才能执行,后续查询是即时的,mysql,node.js,reactjs,Mysql,Node.js,Reactjs,我使用React with Node.js与Mysql 8进行数据库交互。数据库响应良好,应用程序响应良好,一切正常。但是,如果站点空闲了大约5分钟,并且执行了查询,那么返回结果将需要将近一分钟的时间。无论查询是什么或返回的数据量是多少,都可以是5行或1000行,如果站点不活动5分钟,以前立即返回的查询将缓慢返回 问题不在于数据库、缓存或表设计。当您记录交互时,Node.js立即响应,但在sql查询时暂停(同样,仅在空闲后的第一次) Node.js创建了一个包含10个连接的池,这些连接都在那里并

我使用React with Node.js与Mysql 8进行数据库交互。数据库响应良好,应用程序响应良好,一切正常。但是,如果站点空闲了大约5分钟,并且执行了查询,那么返回结果将需要将近一分钟的时间。无论查询是什么或返回的数据量是多少,都可以是5行或1000行,如果站点不活动5分钟,以前立即返回的查询将缓慢返回

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

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

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

经过数天数小时的与所有因素的互动,我对问题的所在感到困惑。Node.js在查询调用之前快速响应,然后减慢响应速度,此后的任何调用都是快速的。Mysql工作台手动查询总是即时的。重新启动Node.js服务器(空闲5分钟后)将保证即时查询

下面是my 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");
.....

“已到达模型,查询前”的日志始终是即时的。除非站点空闲5分钟,“已收到来自DB的响应”的日志是即时的


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

如果(res.length){..,在
之后是否有任何代码?如果没有,如果将其更改为
else{..
else if(res.length),会发生什么情况{…
?是的,res.length后面有代码可以有效地返回结果。它超出了范围,因为res.length部分之前发生了暂停。if(res.length){..
后面有代码吗?如果没有,如果将其更改为
else{..
else if(res.length)会发生什么情况{…
?是的,res.length之后有代码有效地返回结果。由于res.length部分之前发生暂停,因此它超出了范围。