在 Rails 6 和 Puma 上仍然需要工作启动时建立连接吗?

col*_*rco 5 ruby-on-rails heroku puma ruby-on-rails-6

我在 Heroku 上读到,对于 Rails(他们说 4+),当我使用多个工作人员并预加载应用程序时,我应该向 Puma 添加以下指令:

on_worker_boot do
  ActiveRecord::Base.establish_connection
end
Run Code Online (Sandbox Code Playgroud)

但是我有两个preload_app!和多个workers没有那个代码......而且该应用程序似乎工作正常。

我错过了什么吗?那还需要吗?什么目的?

dma*_*ein 5

establish_connection假设您运行的是 Rails 5.2+,则不再需要此调用。

用于 Heroku 上 Puma 配置最佳实践的 Puma 维护插件的配置代码(位于此处)当前包括以下内容:

# Not necessary in Rails 5.2+, see https://github.com/rails/rails/pull/29807
if defined?(::ActiveRecord) && defined?(::ActiveRecord::Base) && Gem::Version.new(Rails.version) < Gem::Version.new('5.2.0')
    c.before_fork { ActiveRecord::Base.connection_pool.disconnect! }
    c.on_worker_boot { ActiveRecord::Base.establish_connection }
end
Run Code Online (Sandbox Code Playgroud)

请注意这里的评论。对链接的 PR 和一些将我链接到的 PR 进行更多的挖掘,就得出了实际上消除了对这些东西的需求的 PR: https: //github.com/rails/rails/pull/31241。在此 PR 中,明确提出了这个问题:

这是否意味着,如果我们在 Rails 5.2.0 之前的 puma.rb 文件中存在现有的 before_fork 和 on_worker_boot 块,那么我们现在可以在升级到 Rails 5.2.0 后简单地删除这些块?

我的朋友,答案是……

是的。(当然,假设他们正在进行 AR 连接管理。)他们可以完全安全地离开那里,因此升级指南中没有提到这一点,但他们应该不再是必要的。