我在 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 应用程序类,并且该连接在 fork()ed 进程中损坏(退出时?),所以下一个分叉孩子们得到一种破碎的全球 ActiveRecord::Base.connection
我可以使用模仿 resque worker 中的 fork/processing 的示例代码重现非常相似的行为。(AFAIK,libpq 的用户无论如何都建议在分叉进程中重新创建连接,否则不安全)
但是,奇怪的是,当我使用 pgbouncer 或 pgpool-II 而不是直接 pgsql 连接时,不会出现这样的错误。
所以,问题是我应该在哪里以及如何挖掘以找出为什么它在普通连接中被破坏并且正在使用连接池?还是合理的解决方法?