【问题标题】:Threads, ActiveRecord and "PG::Error: FATAL: remaining connection slots are reserved for non-replication superuser connections"线程、ActiveRecord 和“PG::Error: FATAL: 剩余的连接槽保留给非复制超级用户连接”
【发布时间】:2023-04-09 17:35:01
【问题描述】:

TL;DR在加入线程后如何关闭与数据库服务器的 ActiveRecord 连接?

我有一个 rake 任务,它一遍又一遍地运行维护任务,但需要对任务执行时间限制(并报告错误等)。我通过使用Thread.new#join(timeout) 来完成此操作,如果需要太长时间,则使用#kill。不幸的是,经过几次迭代,我收到:

PG::Error: FATAL: remaining connection slots are reserved for non-replication superuser connections

Rails 似乎在每次线程启动时都会自动创建一个新的 ActiveRecord 连接。

当我在线程中运行ActiveRecord::Base.connection.close 时问题就消失了,但不幸的是我不能这样做,因为#join

这是简化的代码:

while true
  thr = Thread.new {
    do_some_database_work
  }

  unless thr.join(10)
    thr.kill
  end

  sleep 1
end

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    在连接块之后粘贴这个似乎有效:

    ActiveRecord::Base.verify_active_connections!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-12
      • 2012-08-04
      • 2020-04-26
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2015-03-30
      相关资源
      最近更新 更多