是什么原因导致ActiveRecord在分叉后破坏Postgres连接?

时间:2015-01-11 22:47:47

标签: activerecord fork ruby-on-rails-4.2 postgresql-9.4

我在使用fork的Rails 4.2项目中有一个Rake任务。我的问题是,在分叉进程完成后(即在Process.wait之后),当我再次尝试访问数据库时,我得到以下Postgres错误:

PG::ConnectionBad: PQconsumeInput() server closed the connection unexpectedly

首先,我怀疑ActiveRecord会在分叉进程完成后自动关闭连接。但在阅读了AR connection_pool.rb的代码后,分叉进程似乎应该使用自己的连接:

  

在必须具有的祖先进程中建立连接   随后分叉。我们不能重用连接,但我们可以复制   规范并与之建立新的联系。

(来自ActiveRecord::ConnectionAdapters::ConnectionHandler#pool_for_owner

然而,分叉使得连接变得毫无用处。

我试图阻止分叉进程访问数据库,并在分叉后验证旧连接无法使用以下代码重用:

ActiveRecord::Base.default_connection_handler = nil
ActiveRecord::Base.connection_handler = nil

有关如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:1)

子进程完成工作后,您可以使用ActiveRecord::Base.establish_connection重新建立与数据库的连接。之后,您的Rake流程应该能够像往常一样访问数据库。