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 に答える