Ruby on rails 为单线程Rails应用程序正确设置数据库连接池database.yml

Ruby on rails 为单线程Rails应用程序正确设置数据库连接池database.yml,ruby-on-rails,database,postgresql,activerecord,Ruby On Rails,Database,Postgresql,Activerecord,我想知道Rails database.yml中的以下设置: 默认情况下,ActiveRecord连接池的数据库连接数设置为5: development: ... pool: 5 但是默认情况下,Rails 3是单线程的。 为什么默认情况下需要5个连接 据我所知,单线程Rails应用程序不能同时触发多个数据库操作,为什么需要保持更多连接打开 我假设有两个连接是有意义的,所以即使另一个连接超时,你也总是有一个活动连接,但是保持五个连接对我来说有点奇怪 我错过什么了吗 更新 如果其他人对此感

我想知道Rails database.yml中的以下设置:

默认情况下,ActiveRecord连接池的数据库连接数设置为5:

development:
  ...
  pool: 5
但是默认情况下,Rails 3是单线程的。 为什么默认情况下需要5个连接

据我所知,单线程Rails应用程序不能同时触发多个数据库操作,为什么需要保持更多连接打开

我假设有两个连接是有意义的,所以即使另一个连接超时,你也总是有一个活动连接,但是保持五个连接对我来说有点奇怪

我错过什么了吗

更新 如果其他人对此感到好奇,我只是找到了一个解释:

事实上,这些默认设置没有任何意义,它已被修复,但由于测试套件的原因而临时恢复(一年前)。

管理连接 对于Mongrel/Passenger/etc这样的单线程服务器,连接池的主要好处是,连接是在主Rails请求处理之外的机架处理程序中建立/维护的。这允许建立一次连接,而不是以不同方式使用多次连接。目标是重新使用已建立的连接,并尽量减少连接数。这应该可以避免在给定的请求处理周期内甚至在请求之间重新连接(如果我回忆正确的话)

多个并发连接 尽管大多数用例(Mongrel/Passenger)都是单线程的,一次只能使用一个连接,但JRuby和环境/应用服务器都提供了全多线程支持。Rails自2.2以来一直是线程安全的

  • 连接池在ActiveRecord内部处理,因此所有应用程序服务器的行为应该基本相同

  • 数据库连接池一开始是空的,并根据需要随时间创建连接。此池的最大大小默认为5,并在database.yml中配置

  • 请求和用户共享来自此池的连接。请求在第一次需要访问数据库时签出连接,然后在请求结束时重新签入连接

  • 如果您使用Rails.threadsafe!模式,则可能需要多个线程 同时访问多个连接,因此取决于 请求加载您可能会有多个线程竞争几个线程 联系


如果您使用的是单线程应用程序,您可以相应地进行更改。根据大多数用户的需要,默认值为5,因为现在一天使用多线程应用程序是正常的。

在这里参加聚会已经很晚了,但我今天在生产中的数据库连接用完了

像很多人一样,我使用Sidekiq执行异步工作,例如发送电子邮件。需要注意的是,Sidekiq作为多线程进程运行

因此,我不只是有一个单线程Rails应用程序,因此这个答案并不直接适用于所问的问题,但我认为在这里值得一提,因为我认为多线程Rails应用程序在当今是相对正常的


这意味着您需要调整池大小,以便创建足够的连接来处理所有可以排队的作业,并且需要5秒以上的时间(引发错误之前等待数据库连接的默认超时时间)

这篇博客可能会给你一些启示:加上1,找到提交条目-哈哈,这很有意义,我也以同样的方式理解它。但是仍然有一个悬而未决的问题:为什么每次默认打开5个连接,而在一个单线程Rails请求中基本上只需要一个连接?据我所知,这两个默认设置(threadsafe=false,connection pool=5)似乎相互冲突?多线程应用程序并不是那么正常:)听起来池的大小是:5,但只有一个连接会被建立或使用(或被后续进程重用)在单线程应用程序中,至少为2是有意义的,因为连接已断开,需要重新启动,在此期间,另一个连接应立即可用。对于单线程进程,2似乎是一个更好的默认值,但选择默认值5可能是为了允许应用程序本身中的一些多线程。