我目前正为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中管理连接的正确方法是什么?