首页 > 解决方案 > 在 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."
        });
    }
});

标签: javascriptmysqlnode.jsexpresssequelize.js

解决方案


我不确定您是否仍然遇到此问题,但我已将您的问题添加为书签,以防有人给出答案;因为我自己也有同样的问题。然后,在我自己寻找答案的过程中,我发现了createPool. 没有使用 sequelize,但到目前为止它对我来说效果很好。

如果您还没有找到解决方案(这不太可能),您可以参考我在另一个问题上发布的这个答案。我就像发布问题的人一样,createPool即使我已经多次看到它被建议,但他们对此一无所知。可能的原因是我发现的关于如何使用它的大部分说明要么已经过时,要么太复杂。这可能是我的大脑可以理解的最简单的解决方案。


推荐阅读