Node.js 查询数据库时express.js内存泄漏
我目前正在与express.js中的内存泄漏作斗争。通过注释代码的其余部分,我设法将范围缩小到以下内容:Node.js 查询数据库时express.js内存泄漏,node.js,express,memory-leaks,sequelize.js,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({
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
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
}
给定的代码与原始代码不同,但它仍然会导致泄漏。我还不熟悉express.js,并且正在与代码结构作斗争,因为这是一个带有遗留代码的项目
。/models
文件夹包含一组使用Sequelize定义的模型,例如:
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
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()
根据文档::“关闭此sequelize实例使用的所有连接,并释放所有引用,以便可以对该实例进行垃圾收集”
然而,这种选择似乎是为了保持DB连接正常,可能是出于性能原因。如果我们以这种方式管理连接,是否会出现某种瓶颈或其他数据库性能问题?或者我们应该在请求期间保持连接?简而言之,在express.js中管理连接的正确方法是什么?我从不喜欢这个
this.db=require(“../models”)(app)
。。。哦,当然,它只是传递了一个应用程序的引用。。。但从来没有这种感觉。无论如何,把const db=require(“../models”)
放在顶部,然后把this.db=db(app)
;,怎么样?this.db
有没有清理过?@CodyG.,请看我更新!泄漏仍然存在。@jfriend00我怎么做?管理您的连接可能取决于您的db服务器硬件和db类型(postgres、ms sql…),但也取决于读取