2012-06-17 98 views
0

我有一個Rails 3應用程序,它在mySQL-DB中有幾百條記錄,每小時需要更新多次。實際更新是通過在控制器邏輯中觸發的delayed_job來完成的(檢查自上次更新以來是否有足夠的時間,只有這樣纔會發生)。頻繁更新大量記錄

每個更新都很慢,在某些情況下可能需要一秒(儘管平均每秒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如何像這樣處理數據庫連接?它可能是一些超時問題,沒有檢測/處理正確?

必須有一個默認的方式做到這一點,但無法找到任何至今..

任何幫助表示讚賞。

+0

看看這個,它可以真正幫助加快你的批量更新http://stackoverflow.com/a/2286377/1241447 – jbmeerkat

回答

1

導軌對海量數據記錄來說是一個不好的選擇。看看你是否可以創建一個sql存儲過程或其他避免活動記錄的方式。

  • 如果您確定完全跳過驗證,請使用object.save_with_validation(false)

  • 找到記錄時,使用:select => 'a,b,c,other_fields'限制所需的字段(本例中爲'a','b','c'和'other')。

  • 使用:include可以在初次選擇並加入多個表時進行急切加載。

+0

你可能想重新檢查save_with_validation上的文檔,因爲它需要一個選項散列,而不是布爾值。 –

+0

謝謝,但解決方案不同。見下文。 – scrrr

2

另一種選擇是update_all

+0

謝謝你,但解決方案是不同的。見下文。 – scrrr

0

所以我解決了我的問題。

我使用的rails版本有一些問題(3.0.3),Timeout是由我懷疑的一些錯誤引起的。更新到3.0.x分支的更高版本解決了它,現在一切都運行良好。