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