mySQL-DB に数百のレコードがあり、1 時間ごとに複数回更新する必要がある Rails 3 アプリがあります。実際の更新はdelayed_job
、コントローラーロジックでトリガーされることによって行われます (最後の更新から十分な時間が経過したかどうかを確認し、その後にのみ sth. が発生します)。
各更新は遅く、場合によっては最大 1 秒かかることがあります (ただし、平均して 1 秒あたり 3 ~ 5 回の更新です)。コードは次のようになります。
class Thing < ActiveRecord::Base
...
def self.scheduled_update
Thing.all.each do |t|
...
t.some_property = new_value
t.save
end
end
end
300 ~ 400 レコード後に実行が停止し、遅延したジョブがハングアップして最終的にタイムアウトするように見えることを確認しました (エントリはdelayed_job.log
)。しばらくすると、次のレコードが開始され、また失敗するなど、すべてのレコードが更新されるわけではありません。
これを行う適切な方法は何ですか?
そのように使用した場合、Rails はデータベース接続をどのように処理しますか? 適切に検出/処理されないタイムアウトの問題でしょうか?
これを行うデフォルトの方法があるはずですが、これまでのところ何も見つかりませんでした..
どんな助けでも大歓迎です。