1

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
4

1 回答 1

0

在加入块之后坚持这个似乎有效:

ActiveRecord::Base.verify_active_connections!
于 2013-07-02T04:13:14.870 回答