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

Mar*_*k A 18 node.js sequelize.js

我需要澄清池是什么以及它做了什么.文档说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'
});
Run Code Online (Sandbox Code Playgroud)

P A*_*man 26

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

pool: {
    max: 5,
    min: 0,
    idle: 10000
  }
Run Code Online (Sandbox Code Playgroud)

反映你的游泳池应该:

  1. 从不超过五个开放连接(max: 5)
  2. 至少具有零开放连接/维持没有最小连接数(min: 0)
  3. 连接空闲(未使用)10秒后从池中删除连接(idle: 10000)

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

  • 很好的答案!使用这个`idle`配置,如果我的查询执行超过10秒,连接是否关闭而没有得到响应? (3认同)
  • 不,从字面上看,空闲是指连接将在那里停滞不动的时间。您所说的是`pool.timeout`设置。我认为默认值为30s。之后,查询超时,您将收到一个错误。 (2认同)
  • @sezanzeb如果我没记错的话,我认为该选项是“generic-pool”的默认选项,sequelize4 使用该包进行池化。如果您在续集代码中找不到提及它,那么它可能永远不会真正重置它?最新的续集,顺便说一句,似乎使用了续集池,但我对此一无所知。这些都是猜测,不过,我已经很久没有看过这些东西了...... (2认同)

Chr*_*ner 5

池正在排空错误

我在搜索 Sequalize 错误时发现这个线程给了我的 node.js 应用程序:池正在耗尽。我一生都无法弄清楚。所以对于那些追随我脚步的人:

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