我有一个运行着Rails应用程序和Resque工作进程的网站,在Ubuntu 9.10,Rails 2.3.4,ruby-ee 2010.01和PostgreSQL 8.4.2上以生产模式运行。
工作进程不断抛出错误:PGError: server closed the connection unexpectedly。
我最好的猜测是,主Resque进程在加载Rails应用程序类时建立与数据库的连接(例如,当使用User.acts_as_authentic时,Authlogic会这样做),而该连接在fork()的进程中变得损坏(在退出时?),因此下一个fork()的子进程获得了一种有问题的全局ActiveRecord:: Base.connection。
我可以使用这个示例代码模拟Resque工作程序中的fork /处理,从而复制非常相似的行为。 (据我所知,libpq用户建议在forked进程中重新创建连接,否则不安全)
但是,奇怪的是,当我使用pgbouncer或pgpool-II而不是直接pgsql连接时,这些错误不会出现。
因此,问题是我应该在哪里和如何挖掘才能找出为什么直接连接出了问题,而连接池却可以正常工作?或者合理的解决方法?
ENV['QUEUE']
这一行,因为它会通过将队列设置为*
来破坏生成任何特定于队列的工作进程。 - nessur