2017-05-26 106 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任务中运行一个函数,并且希望它从前一天停止的地方运行。 –