私は rufus-scheduler を使用して、ActiveRecord オブジェクトでいくつかのさまざまなタスクを実行する多数の頻繁なジョブを実行しています。なんらかのネットワークまたは postgresql の問題が発生した場合、回復後でも、プロセスが再起動されるまで、すべてのスレッドが次のエラーをスローします。
ActiveRecord::ConnectionTimeoutError (5 秒以内にデータベース接続を取得できませんでした (5.000122687 秒待機)。最大プール サイズは現在 5 です。それを増やすことを検討してください。
このエラーは、postgres を再起動することで簡単に再現できます。プールサイズで(最大15)遊んでみましたが、運がありません。
これにより、接続が古い状態にあるだけであると信じるようになり、clear_stale_cached_connections!
.
これを行うためのより信頼できるパターンはありますか?
渡されるブロックは単純な選択とアクティブ レコードの更新呼び出しであり、たまたま AR オブジェクトが何であるかが問題になります。
ルーファスの仕事:
scheduler.every '5s' do
db do
DataFeed.update #standard AR select/update
end
end
ラッパー:
def db(&block)
begin
ActiveRecord::Base.connection_pool.clear_stale_cached_connections!
#ActiveRecord::Base.establish_connection # this didn't help either way
yield block
rescue Exception => e
raise e
ensure
ActiveRecord::Base.connection.close if ActiveRecord::Base.connection
ActiveRecord::Base.clear_active_connections!
end
end