node.js - 我应该在整个服务器运行期间保留 Sequelize 实例吗?
问题描述
我有一个 Sequelize 实例,它被导出到一个文件中,以便在执行数据库操作时访问。
const sequelize = new Sequelize('database', 'username', null, {
dialect: 'mysql'
});
module.exports = sequelize;
因此,该实例是在 expressjs 服务器启动时创建的,并且永远不会销毁。我想知道这是否是正确的方法,还是new Sequelize
每次使用数据库操作时都应该调用?
我认为它应该保持活动状态,因为这就是数据库池可以生效的方式。正确的?
解决方案
底线是 -是的,它应该保持活力。如果您保持实例处于活动状态,则不会对性能造成任何影响。因为它将是处理未来连接的 Sequelize 实例(以及扩展的 ORM)。这还包括(如您所述)池化。
连接
当涉及到池配置本身时,它有点棘手。根据您的配置,池有一些“空间”可供使用 - 创建连接的限制、删除连接之后的空闲持续时间等。我当然可以想象根本不需要保持连接处于活动状态的情况 -例如,公司的内部系统不会在一夜之间使用。
Sequelize ORM 在配置连接池时为您提供了一组很好的选项供您选择。通常,您确实希望重用连接,因为建立新连接非常昂贵 - 不仅仅是因为网络(例如授权,可能是代理等),还因为创建数据库连接时发生的内存分配(这就是为什么在每个请求上重新连接不是一个好主意..)。
但是,这一切都取决于您使用的数据库引擎(以及您的系统有多忙);例如,MySQL 可以缓存连接。当一个连接关闭时,它被返回到线程缓存而不是被丢弃(一段时间)。当新连接打开时,MySQL 将查看线程缓存而不是尝试建立新连接。
你可能想通过这些:
https://stackoverflow.com/a/4041136/8775880(关于池如何工作的很好的解释)
https://stackoverflow.com/a/11659275/8775880(很好地解释了保持连接打开有多昂贵)
推荐阅读
- android - 访问被拒绝查找属性“vendor.camera.aux.packagelist” Flutter
- angular - Ag 网格组件过度滚动问题
- javascript - 使用 CSS 和 HTML 对齐项目时出现问题
- swift - 得到'没有这样的模块'FirebaseFirestore'和'没有这样的模块'{NameofProject}''
- python - Python中列表类型的Pandas列的值计数字符串出现次数
- rust - 为什么 Rust 不允许你使用嵌套可变引用的最内层生命周期?
- postgresql - 9.4 的 pg_restore 失败并出现错误“无法执行查询”
- eclipse - Eclipse RCP:是否有任何工具可用于在插件项目中实现“查找和替换”功能?
- javascript - 如何动态更改 PayPal 货币代码
- javascript - 反应式下拉