【问题标题】:What causes ActiveRecord breaking Postgres connection after forking?是什么导致 ActiveRecord 在分叉后断开 Postgres 连接?
【发布时间】:2015-03-09 16:29:40
【问题描述】:

我在使用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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多