我在 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/