6

我在 Rails 4.2 项目中有一个使用fork. 我的问题是,在分叉进程完成后(即之后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

关于如何解决这个问题的任何建议?

4

1 回答 1

1

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

于 2016-03-09T18:45:55.953 回答