2017-05-26 160 views
2

我有一個用ruby寫的模塊,它連接到postgres表,然後應用一些邏輯和代碼。處理軌道中的連接中斷

下面是一個示例代碼:

module SampleModuleHelper 
    def self.traverse_database 
    ProductTable.where(:column => value).find_each do |product| 
     #some logic here that takes a long time 
    end 
    end 
end 

的productTable已經超過300萬條記錄。我使用where子句來縮短檢索的記錄數。

但是我需要使代碼連接證明。有時連接中斷,我必須從頭開始遍歷表。我不想要這個,而是應該從停止的地方開始,因爲每個記錄所花費的時間太多。

什麼是最好的方式,使代碼開始離開的地方?

一種方法是在數據庫中創建一個表,記錄主鍵(id)停在哪裏並從那裏再次啓動。但是我不想在數據庫中創建表格,因爲有很多這樣的過程。

回答

2

您可以保留處理記錄的計數器並使用offset方法繼續處理。

MAX_RETRIES = 3 
def self.traverse(query) 
    counter = 0 
    retries = 0 
    begin 
    query.offset(counter).find_each do |record| 
     yield record 
     counter += 1 
    end 
    rescue ActiveRecord::ConnectionNotEstablished => e # or whatever error you're expecting 
    retries += 1 
    retry unless retries > MAX_RETRIES 
    raise 
    end 
end 

def self.traverse_products 
    traverse(ProductTable.where(column: value)) do |product| 
    # do something with `product` 
    end 
end 
+0

但如何從同一點這個功能的簡歷,如果我再次啓動功能:

的線沿線的東西嗎?每次調用traverse_products時,計數器和重試都初始化爲零。 –

+0

你不需要再次啓動它,因爲它會自己「重試」任何錯誤。你只需要插入正確的錯誤類,因爲我不知道你期望提出什麼樣的錯誤... –

+0

這是偉大的...但我不認爲會符合我的目的。我需要在cron任務中運行一個函數,並且希望它從前一天停止的地方運行。 –