Утечка памяти в express.js при запросе базы данных - PullRequest
0 голосов
/ 29 ноября 2018

В настоящее время я борюсь с утечкой памяти в express.js.Закомментировав остальную часть кода, мне удалось сузить до следующего:

const db = require("../models")

class AuthorizationService {

    constructor(app) {
        this.db = db(app)
    }

    async retrieveRealmByDeviceId(req) {
        await this.db.Device.find({
            where: {
                id: "1"
            }
        })
    }
}

module.exports = AuthorizationService

Данный код не такой, как оригинал, но он все же вызывает утечку.Я также новичок в express.js и борюсь со структурой кода, так как это проект с унаследованным кодом.

Папка ../models содержит несколько моделей, определенных с помощью Sequelize, например:

const Sequelize = require("sequelize")

module.exports = (sequelize, DataTypes) => {

    const Device = sequelize.define("device", {
        id: {
            type: Sequelize.STRING,
            primaryKey: true,
            unique: true
        },
        userIdentifier: {
            type: Sequelize.STRING
        }
    })

    Device.associate = (models) => {
        Device.hasMany(models.AuthenticationChallenge, {
            as: "ACS",
            foreignKey: "deviceId",
            sourceKey: "id",
            onDelete: "cascade"
        })
        Device.hasMany(models.DeviceCertificate, {
            as: "DCS",
            foreignKey: "deviceId",
            sourceKey: "id"
        })
        Device.belongsTo(models.Realm, {
            foreignKey: "realmId",
            targetKey: "id"
        })
        Device.belongsToMany(models.Certificate, {
            as: "CS",
            through: models.DeviceCertificate,
            foreignKey: "deviceId",
            otherKey: "certificateId",
            constraints: false
        })
    }

    return Device
}

Я не уверен, какая другая информация может потребоваться, но, пожалуйста, дайте мне знать.

Что может быть причиной этой утечки?Как я могу это обнаружить?

Редактировать:

Мы только что узнали, как устранить утечку, введя:

await this.db.sequelize.close()

Согласно документации, close : "Закрыть все соединения, используемые этим экземпляром sequelize, и освободить все ссылки, чтобы экземпляр мог быть подвергнут сборке мусора ."

Однако, похоже, этот выбор был сделандизайн для поддержания соединения с БД, возможно, по соображениям производительности.Стоит ли ожидать каких-либо узких мест или других проблем с производительностью базы данных, если мы будем управлять соединениями таким образом?Или мы должны поддерживать связь на время запроса?Короче говоря, как правильно управлять соединениями в express.js?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...