小编gc.*_*gc.的帖子

Rails Resque工作程序因PGError而失败:服务器意外关闭了连接

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

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

我最好的猜测是主resque进程建立与db的连接(例如authlogic在使用User.acts_as_authentic时这样做),同时加载rails app类,并且该连接在fork()ed进程中被破坏(退出?),所以下一个分叉孩子们得到了一些破碎的全局ActiveRecord :: Base.connection

我可以使用此示例代码重现非常类似的行为,模拟resque worker中的fork/processing.(AFAIK,libpq的用户建议无论如何都要在forked进程中重新创建连接,否则它不安全)

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

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

ruby postgresql activerecord ruby-on-rails resque

20
推荐指数
3
解决办法
6974
查看次数

标签 统计

activerecord ×1

postgresql ×1

resque ×1

ruby ×1

ruby-on-rails ×1