【问题标题】:Updating a lot of records frequently经常更新很多记录
【发布时间】:2012-06-17 01:36:26
【问题描述】:

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

必须有一个默认的方法来做到这一点,但到目前为止找不到任何东西..

感谢任何帮助。

【问题讨论】:

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


【解决方案1】:

另一个选项是update_all

【讨论】:

  • 谢谢nbsp,但解决方案不同。见下文。
【解决方案2】:

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

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

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

  • 当您最初跨多个表选择和连接时,使用 :include 进行预加载。

【讨论】:

  • 您可能需要重新检查 save_with_validation 上的文档,因为它需要一个选项哈希,而不是布尔值。
  • 谢谢,但解决方案不同。见下文。
【解决方案3】:

所以我解决了我的问题。

我使用的 rails-version (3.0.3) 有一些问题,超时是由我怀疑的一些错误引起的。更新到更高版本的 3.0.x 分支解决了这个问题,现在一切运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2018-01-27
    • 2013-05-02
    • 2014-03-04
    相关资源
    最近更新 更多