首页 > 解决方案 > 我应该在整个服务器运行期间保留 Sequelize 实例吗?

问题描述

我有一个 Sequelize 实例,它被导出到一个文件中,以便在执行数据库操作时访问。

const sequelize = new Sequelize('database', 'username', null, {
  dialect: 'mysql'
});
module.exports = sequelize;

因此,该实例是在 expressjs 服务器启动时创建的,并且永远不会销毁。我想知道这是否是正确的方法,还是new Sequelize每次使用数据库操作时都应该调用?

我认为它应该保持活动状态,因为这就是数据库池可以生效的方式。正确的?

标签: node.jssequelize.js

解决方案


底线是 -是的,它应该保持活力。如果您保持实例处于活动状态,则不会对性能造成任何影响。因为它将是处理未来连接的 Sequelize 实例(以及扩展的 ORM)。这还包括(如您所述)池化。

连接

当涉及到池配置本身时,它有点棘手。根据您的配置,池有一些“空间”可供使用 - 创建连接的限制、删除连接之后的空闲持续时间等。我当然可以想象根本不需要保持连接处于活动状态的情况 -例如,公司的内部系统不会在一夜之间使用。

Sequelize ORM 在配置连接池时为您提供了一组很好的选项供您选择。通常,您确实希望重用连接,因为建立新连接非常昂贵 - 不仅仅是因为网络(例如授权,可能是代理等),还因为创建数据库连接时发生的内存分配(这就是为什么在每个请求上重新连接不是一个好主意..)。

但是,这一切都取决于您使用的数据库引擎(以及您的系统有多忙);例如,MySQL 可以缓存连接。当一个连接关闭时,它被返回到线程缓存而不是被丢弃(一段时间)。当新连接打开时,MySQL 将查看线程缓存而不是尝试建立新连接。

你可能想通过这些:


推荐阅读