如何在maintenance_tasks gem中设置ActiveRecord批量处理的batch_size?
如何为MaintenanceTasks设置批次大小(batch_size)
当你的collection方法返回ActiveRecord::Relation时,MaintenanceTasks会自动基于这个查询结果创建ActiveRecordEnumerator,批次大小不能靠设置实例变量@batch_size或普通方法来配置,正确的方式是从Task类层面指定:
直接设置类属性
在你的任务类里直接赋值self.batch_size即可:class YourMaintenanceTask < MaintenanceTasks::Task self.batch_size = 500 # 换成你需要的数值 def collection YourModel.all # 你的ActiveRecord查询逻辑 end def process(record) # 单个记录的处理代码 end end动态计算批次大小(可选)
如果需要根据环境或其他条件动态调整,可以重写batch_size类方法:class YourMaintenanceTask < MaintenanceTasks::Task def self.batch_size Rails.env.production? ? 1000 : 200 # 生产环境用1000,其他环境用200 end def collection YourModel.all end def process(record) # 处理逻辑 end end
为什么之前的方法无效?
MaintenanceTasks内部在构建枚举器时,是从任务类的类属性/类方法读取批次大小,再传递给job-iteration的ActiveRecordEnumerator,所以实例变量或普通实例方法的设置不会被识别。
调整批次大小的时候要结合数据库性能和查询复杂度,别一下子设得太大,避免数据库压力过高或者内存占用超标。
内容的提问来源于stack exchange,提问作者Brian Ray
相关产品推荐
相关产品推荐

