经常更新大量记录

时间:2012-06-17 01:36:27

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有一个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如何处理数据库连接?可能是某些超时问题未被正确检测/处理?

必须有一种默认方式来执行此操作,但到目前为止找不到任何内容..

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

另一个选项是update_all

答案 1 :(得分:1)

对于海量数据记录,Rails是一个糟糕的选择。看看你是否可以创建一个sql存储过程或其他一些避免活动记录的方法。

  • 如果您可以完全跳过验证,请使用object.save_with_validation(false)

  • 查找记录时,请使用:select => 'a,b,c,other_fields'来限制您想要的字段(本例中为“a”,“b”,“c”和“其他”)。

  • 当您最初选择并加入多个表时,请使用:include进行预先加载。

答案 2 :(得分:0)

所以我解决了我的问题。

我使用的rails版本存在一些问题(3.0.3),Timeout是由我怀疑的一些错误引起的。更新到3.0.x分支的更高版本解决了它,现在一切都运行良好。