ruby-on-rails - Rails Resque 工作人员因 PGError : server closed the connection unexpectedly 失败

标签 ruby-on-rails ruby postgresql activerecord resque

我在 Ubuntu 9.10、Rails 2.3.4、ruby-ee 2010.01、PostgreSQL 8.4.2 上有站点运行 rails 应用程序和在生产模式下运行的 resque worker

Workers 不断报错:PGError: server closed the connection unexpectedly.

我最好的猜测是 master resque 进程建立了与 db 的连接(例如,authlogic 在使用 User.acts_as_authentic 时会这样做),同时加载 Rails 应用程序类,并且该连接在 fork()ed 进程(退出时?)中被破坏,所以下一个 fork 的 child 会得到一种 splinter 的全局 ActiveRecord::Base.connection

我可以用这个 sample code 重现非常相似的行为在 resque worker 中模仿 fork/processing。 (据我所知,libpq 的用户无论如何都建议在 fork 进程中重新创建连接,否则不安全)

但是,奇怪的是,当我使用 pgbouncer 或 pgpool-II 而不是直接连接 pgsql 时,不会出现这样的错误。

所以,问题是我应该在哪里以及如何挖掘以找出为什么它在普通连接中被破坏并且正在使用连接池?或者合理的解决方法?

最佳答案

在做了一些研究/试错之后。对于遇到相同问题的任何人。澄清 gc 提到的内容。

Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }

以上代码应放在:/lib/tasks/resque.rake

例如:

require 'resque/tasks'

task "resque:setup" => :environment do
  ENV['QUEUE'] = '*'

  Resque.after_fork do |job|
    ActiveRecord::Base.establish_connection
  end

end

desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"

希望这对某人有所帮助,就像对我一样。

关于ruby-on-rails - Rails Resque 工作人员因 PGError : server closed the connection unexpectedly 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2611747/

相关文章:

ruby-on-rails - 如何更新生产环境的记录?

ruby-on-rails - Rails 遗留代码中一些以 ";1"结尾的行

ruby - 无法理解 Grape API 路由参数

通过 NVM 安装 Ruby 失败并出现依赖项错误

node.js - Node Orm2 交易插件

ruby-on-rails - Paperclip w/Imagemagick、Amazon S3 和 Heroku - Imagemagick 和 S3 工作,但 Paperclip 字段未在数据库中设置。在开发中工作正常

ruby-on-rails - 如何强制 Jruby 使用内置的 Ruby 1.9 而不是默认的 Ruby 1.8?

ruby - 为什么mac下Ruby下有很多 "fsevent_watch"的实例?

postgresql - 将 SAP 内部数据镜像到外部系统

postgresql - AWS Redshift 批量插入 + 编码定义