项目中经常有种情况对某个对象的数据与及相关对象的数据作处理,如运算等. 例如对一个客户下的相关对象A,B,C的记录修改所有人.
通常做法
对于类似于这种情况通常我们会采用Apex Job 来做,写一个Apex Job ,在 开始方法中查询Account 然后在 执行 方法中 采用如下方式:
//查对象A的记录
//更新记录A
//查对象B的记录
//更新记录B
//查对象C的记录
//更新记录C
这样做固然能满足需求,代码也简单. 但这样至少有两问题.
- 没有考虑数据量大的问题
- 没有考虑,如果在一个批次时,某个对象更新失败,会导致整个这个批次的其它数据受影响, 尤其是在一个批次中支持多个客户时,影响更大.
分组处理
为了把上面两个点考虑,在处理数据时,先对数据分组
-
新建一个包装类,两个属性
class { private String objectType; private List<Sobject> sobjectList; }
-
新建Batch A ,用来对数据分组. 在开始方法中查询记录. 在执行方法中对处理后的数据通过Map 对数据分组,封装.按对象封装 如果数据量比较大,可以按一定的大小对数据切片封装,比如5000记录分一组
-
Batch A 执行完所有批次后得到一个List<Class>的集合.传递给下一个Batch
-
Batch B 拿到结果后,更新到DB中
这样做需要借多个Batch,如果数据量不大,可直接在开始方法中分组. 当对象A,B,C数据量很大时,可能出现内存超限,因为我们使用了全局变量存结果集 这样就只能按对象单独处理,先处理对象A,分组后将结果给BatchB,然后再处理对象B,C.这样处理如果一个批次出现错误,影响的只是同一个对象的数据.
另外不要试图不用对象,将Sobject 放到一个集合中,这样Batch B 在更新到DB中 会出现一个,分区不能超过10个的错误(错误名当时没有记),第一次见,原因是在dml时,貌似会对数据分组,把同一类型的数据分组,如果分组超过10个就运行时异常,这个还有个公式可以计算的,下次找到更新到这里
如果你有好的方法请留下你的脚印.