查询数据库时express.js中的内存泄漏

时间:2018-11-29 19:18:24

标签: node.js express memory-leaks sequelize.js

我目前正为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:“关闭此序列实例使用的所有连接,并释放所有引用,以便可以对该实例进行垃圾回收。”

但是,似乎是出于设计原因而做出的选择,目的是保持数据库连接正常。如果以这种方式管理连接,我们是否应该期望出现某种瓶颈或其他数据库性能问题?还是在请求期间保持连接?简而言之,在express.js中管理连接的正确方法是什么?

0 个答案:

没有答案