TL;DR加入线程后如何关闭与数据库服务器的 ActiveRecord 连接?
我有一个 rake 任务,它一遍又一遍地运行维护任务,但需要对任务执行时间限制(并报告错误等)。我通过使用Thread.newand来实现这一点#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