В настоящее время я борюсь с утечкой памяти в 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?