我有一个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如何处理数据库连接?可能是某些超时问题未被正确检测/处理?
必须有一种默认方式来执行此操作,但到目前为止找不到任何内容..
感谢任何帮助。
答案 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分支的更高版本解决了它,现在一切都运行良好。