0

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

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

任何帮助表示赞赏。

4

3 回答 3

2

另一个选项是update_all

于 2012-06-17T01:53:44.690 回答
1

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

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

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

  • :include当您最初跨多个表选择和加入时,用于预加载。

于 2012-06-17T01:47:40.070 回答
0

所以我解决了我的问题。

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

于 2012-06-17T13:49:56.560 回答