javascript - 在 Node.js 中运行 sequelize 时会导致超时的原因是什么?
问题描述
在我的Node.js (v10.15.0) 应用程序中,我使用sequelize包 (v4.44.3) 连接到远程MySQL数据库。此应用程序在 Docker 容器中运行。运行程序很长时间后,我的 REST 请求开始出现超时。这个问题只能通过重新加载 Docker 容器本身来解决。不幸的是,经过几天的程序,这个问题一次又一次地重复。什么可能导致这个问题?
MySQL.js:
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const operatorsAliases = {
$eq: Op.eq,
$ne: Op.ne,
$gte: Op.gte,
$gt: Op.gt,
$lte: Op.lte,
$lt: Op.lt,
$not: Op.not,
$in: Op.in,
$notIn: Op.notIn,
$is: Op.is,
$like: Op.like,
$notLike: Op.notLike,
$iLike: Op.iLike,
$notILike: Op.notILike,
$regexp: Op.regexp,
$notRegexp: Op.notRegexp,
$iRegexp: Op.iRegexp,
$notIRegexp: Op.notIRegexp,
$between: Op.between,
$notBetween: Op.notBetween,
$overlap: Op.overlap,
$contains: Op.contains,
$contained: Op.contained,
$adjacent: Op.adjacent,
$strictLeft: Op.strictLeft,
$strictRight: Op.strictRight,
$noExtendRight: Op.noExtendRight,
$noExtendLeft: Op.noExtendLeft,
$and: Op.and,
$or: Op.or,
$any: Op.any,
$all: Op.all,
$values: Op.values,
$col: Op.col
};
const sequelize = new Sequelize(
process.env.MySQL_DATABASE_NAME,
process.env.MySQL_USER,
process.env.MySQL_PASSWORD,
{
host: process.env.MySQL_HOST,
port: process.env.MySQL_PORT,
dialect: 'mysql',
operatorsAliases: operatorsAliases,
pool: {
max: 15,
min: 5,
idle: 20000,
evict: 15000,
acquire: 30000
}
}
);
sequelize.authenticate().then(() => {
console.log('Connection to remote MySQL database has been established successfully.');
}).catch(err => {
console.error('Unable to connect to remote MySQL database:', err);
});
module.exports = sequelize;
应用程序.js:
const express = require('express');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const cors = require('cors');
require('dotenv').config();
const locationsRouter = require('./routes/locations');
const app = express();
app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(cookieParser());
app.use('/api/locations', locationsRouter);
module.exports = app;
位置.js:
const express = require('express');
const router = express.Router();
const sequelize = require('../configurations/MySQL');
const Sequelize = require('sequelize');
const passport = require('passport');
require('../configurations/Password')(passport);
router.post('/search_location', passport.authenticate('jwt', {session: false}, null), function(req, res) {
const token = getToken(req.headers);
if (token) {
sequelize.query("SQL_STATEMENT",
{
replacements: {
latitude : parseInt(req.body.latitude),
longitude: parseInt(req.body.longitude)
},
type: Sequelize.QueryTypes.SELECT
}).then((locations) => {
res.status(200).send(locations)
}).catch((error) => {
console.log(error);
res.status(500).send(error);
});
} else {
return res.status(401).send({
status: false,
description: "Access denied."
});
}
});
解决方案
我不确定您是否仍然遇到此问题,但我已将您的问题添加为书签,以防有人给出答案;因为我自己也有同样的问题。然后,在我自己寻找答案的过程中,我发现了createPool
. 没有使用 sequelize,但到目前为止它对我来说效果很好。
如果您还没有找到解决方案(这不太可能),您可以参考我在另一个问题上发布的这个答案。我就像发布问题的人一样,createPool
即使我已经多次看到它被建议,但他们对此一无所知。可能的原因是我发现的关于如何使用它的大部分说明要么已经过时,要么太复杂。这可能是我的大脑可以理解的最简单的解决方案。
推荐阅读
- php - 带有帖子数据的Jquery自动完成
- python-3.x - 使用本地 nltk_data 的 Python NLTK
- arrays - 在 VBA 中使用数组创建堆积柱形图
- java - 使用 Spring Data 和 Couchbase 时,@Version 字段未添加到文档中
- html - CSS网格如何计算行自动高度?
- java - java.lang.IllegalStateException:ie浏览器中不存在驱动程序可执行文件
- android - 运行长任务时前台服务停止
- python - 优雅的跨平台 cython 模块编译
- styled-components - 为什么在样式化的组件道具中未定义主题?
- c++ - 我无法在 qt 的 C++ 代码中定义字符串