mysql - 空闲后带有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 分钟。
我不确定要关注哪个元素。
解决方案
推荐阅读
- python - 如何将 QWindow 设置为对鼠标和其他事件透明?
- c# - 从 json 响应中只获取一个变量
- datetime - 如何在 Power BI 中将“日”、“月”和“年”、“小时”列组合成日期时间列?
- intel-oneapi - 无法使用 Intel oneAPI DPCT 迁移我的应用程序:错误代码 -5
- google-apps-script - 如何在函数中使用地图 - Apps 脚本
- powershell - Powershell参数传入for循环以发挥作用
- python - 使用 SimpleImputer 输入最小值时出错
- python - OLS回归python中的预测形状未对齐错误
- mysql - 选择查询中的 Laravel 雄辩的 json
- message-queue - 消息队列 *like* 技术