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