Kor*_*tor 6 activerecord fork postgresql-9.4 ruby-on-rails-4.2
我在使用的Rails 4.2项目中有一个Rake任务fork
.我的问题是,在分叉进程完成后(即之后Process.wait
),当我尝试再次访问数据库时,我收到以下Postgres错误:
PG::ConnectionBad: PQconsumeInput() server closed the connection unexpectedly
Run Code Online (Sandbox Code Playgroud)
起初我怀疑ActiveRecord在分叉进程完成后自动关闭连接.但在阅读了AR的代码后connection_pool.rb
,分叉进程似乎应该使用自己的连接:
在祖先进程中建立了连接,该进程必须随后分叉.我们不能重用连接,但我们可以复制规范并与之建立新连接.
(来自ActiveRecord::ConnectionAdapters::ConnectionHandler#pool_for_owner
)
然而,分叉使连接无用.
我试图阻止分叉进程完全访问数据库,并在分叉后验证旧连接无法使用以下代码重用:
ActiveRecord::Base.default_connection_handler = nil
ActiveRecord::Base.connection_handler = nil
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何建议?
子进程完成工作后,您可以使用 重新建立与数据库的连接ActiveRecord::Base.establish_connection
。之后,您的 Rake 进程应该能够像往常一样访问数据库。
归档时间: |
|
查看次数: |
656 次 |
最近记录: |