处理轨道中的连接中断
问题描述:
我有一个用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)停在哪里并从那里再次启动。但是我不想在数据库中创建表格,因为有很多这样的过程。
答
您可以保留处理记录的计数器并使用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
但如何从同一点这个功能的简历,如果我再次启动功能:
的线沿线的东西吗?每次调用traverse_products时,计数器和重试都初始化为零。 –
你不需要再次启动它,因为它会自己“重试”任何错误。你只需要插入正确的错误类,因为我不知道你期望提出什么样的错误... –
这是伟大的...但我不认为会符合我的目的。我需要在cron任务中运行一个函数,并且希望它从前一天停止的地方运行。 –