【发布时间】: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