我已经现场运转轨道的应用和resque工人在生产模式下运行,在Ubuntu 9.10,Rails的2.3.4,红宝石-EE 2010.01,PostgreSQL的8.4.2

工人不断提高错误:PGError:服务器关闭了连接意外地

我最好的猜测是,主resque过程建立连接到分贝(例如authlogic做的是,当使用User.acts_as_authentic),而装载导轨应用的类,以及连接变得在叉损坏()ED方法(在退出?),所以接下来的分叉孩子得到一种打破全球的ActiveRecord :: Base.connection

我能再现与在resque工人处理此示例代码模仿叉/非常相似的行为。 (AFAIK,libpq的用户推荐无论如何重新创建派生进程的连接,否则这不是安全的)

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

那么,问题是在哪里,我应该如何挖掘,找出为什么它打破了简单的连接,并正在与连接池?或合理解决办法:

有帮助吗?

解决方案

当我创建内斯特时,我有同样的问题。解决的办法是重新建立在派生进程的连接。请参阅相关的代码在 HTTP ://github.com/francois/nestor/blob/master/lib/nestor/mappers/rails/test/unit.rb#L162

从我的非常的在Resque代码看起来有限,我相信#establish_connection调用应该做的事说得对,在这里:的 https://github.com/resque/resque/blob/master/lib/resque/worker.rb#L123

其他提示

做了一些研究/试验和错误的之后。对于任何人谁是在同样的问题来了。到澄清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"

希望这可以帮助别人,尽可能多地为我做的。

您不能跨fork传递的libpq引用()(或到一个新的线程),除非你的应用需要非常密切的护理方式相互矛盾不使用它的。 (喜欢身边的每一次尝试互斥来使用它,你绝不能接近它)。这对于直接连接和使用pgbouncer相同。如果曾在pgbouncer,这是在缺少某种原因的竞争条件纯粹是运气,而最终将会被突破。

如果你的程序使用分叉,您的必须的创建连接的之后的叉。

更改Apache配置和添加

PassengerSpawnMethod conservative

我和我所有的梅勒类的这个问题,我需要,以确保作出的连接邮包方法中调用ActiveRecord::Base.verify_active_connections!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top