处理导轨中的连接断裂

时间:2017-05-26 09:20:25

标签: ruby-on-rails ruby postgresql database-connection

我有一个用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)并从那里开始。但是我不想在数据库中创建表,因为有很多这样的过程。

1 个答案:

答案 0 :(得分: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