如何在 Sequelize.js 中使用数据库连接池

Posted

技术标签:

【中文标题】如何在 Sequelize.js 中使用数据库连接池【英文标题】:How to use database connections pool in Sequelize.js 【发布时间】:2016-06-02 05:20:35 【问题描述】:

我需要澄清一下池是什么以及它的作用。文档说 Sequelize 将在初始化时设置一个连接池,因此理想情况下,您应该只为每个数据库创建一个实例。

var sequelize = new Sequelize('database', 'username', 'password', 
  host: 'localhost',
  dialect: 'mysql'|'mariadb'|'sqlite'|'postgres'|'mssql',

  pool: 
    max: 5,
    min: 0,
    idle: 10000
  ,

// SQLite only
   storage: 'path/to/database.sqlite'
);

【问题讨论】:

连接池为何有用:***.com/questions/44081488/… 【参考方案1】:

当您的应用程序需要从数据库中检索数据时,它会创建一个数据库连接。创建此连接涉及应用程序和数据库的一些时间和机器资源开销。许多数据库库和 ORM 会在可能的情况下尝试重用连接,这样它们就不会产生一遍又一遍地建立数据库连接的开销。 pool 是这些保存的、可重用的连接的集合,在您的情况下,Sequelize 会从中提取这些连接。你的配置

pool: 
    max: 5,
    min: 0,
    idle: 10000
  

反映您的游泳池应该:

    打开的连接永远不要超过五个 (max: 5) 至少有零个打开连接/保持没有最小连接数 (min: 0) 在连接空闲(未使用)10 秒后从池中删除连接 (idle: 10000)

tl;dr:池是有助于提高数据库和整体应用程序性能的好东西,但如果您对池配置过于激进,可能会对整体性能产生负面影响。

【讨论】:

不错的答案!使用此idle 配置,如果我的查询执行时间超过 10 秒,连接是否在我没有得到响应的情况下关闭? 不,空闲实际上是连接将在那里无所事事的时间。你说的是pool.timeout 设置。我认为默认为30s。之后查询超时,你会得到一个错误。 不错的答案先生 @steev 当前的文档以及 v4 的文档都没有谈论 pool.timeout。我在源代码中也找不到 pool.timeout 。有关 postgres 上的类似内容,请参阅 ***.com/a/62697070/4417769 @sezanzeb 如果我没记错的话,我认为该选项是“generic-pool”的默认值,即 sequelize4 用来进行池化的包。如果您在续集代码中找不到提及它,那么它可能永远不会真正重置它?最新的续集,顺便说一句,似乎使用了 sequelize-pool,我对此一无所知。这些都是猜测,但是,我已经很久没有看到这些东西了......【参考方案2】:

池正在排空错误

我在搜索 Sequalize 时发现此线程给我的 node.js 应用程序提供了错误:pool is draining。我无法为我的生活弄明白。所以对于那些追随我脚步的人:

问题是我使用命令sequelize.closeConnections() 关闭数据库的时间比我想象的要早。出于某种原因,它不是像“数据库已关闭”这样的错误,而是给出了一个模糊的错误“池正在耗尽”。

【讨论】:

感谢您抽出宝贵时间发布此内容。最后,这也是我的问题。再加上tricky forEach【参考方案3】:

似乎您可以尝试将 pool 放入 false 以避免创建池 bing。这是 API 详细信息表:http://sequelize.readthedocs.org/en/latest/api/sequelize/

[options.pool=] 目的 应该续集使用连接池。 默认为真

【讨论】:

您能否详细介绍一下池和池对象 不推荐,因为它会严重影响您的应用程序的性能 错误:在 v4.0 中删除了对 pool:false 的支持

以上是关于如何在 Sequelize.js 中使用数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize.js - 连接子句中的子选择

使用 PostgreSQL 进行一对多设计的 Sequelize.js 最佳实践 [关闭]

在 sequelize.js 中使用 build 方法时是不是需要验证、清理或转义数据

在 sequelize.js 中获取与 belongsToMany 的关联

我们可以在使用 sequelize js 节点在 mysql 表中插入数据后给时间吗

如何在关联表Sequelize js中获取自定义字段