关于批处理先对数据分组

项目中经常有种情况对某个对象的数据与及相关对象的数据作处理,如运算等. 例如对一个客户下的相关对象A,B,C的记录修改所有人.

通常做法

对于类似于这种情况通常我们会采用Apex Job 来做,写一个Apex Job ,在 开始方法中查询Account 然后在 执行 方法中 采用如下方式:

//查对象A的记录

//更新记录A

//查对象B的记录

//更新记录B

//查对象C的记录

//更新记录C

这样做固然能满足需求,代码也简单. 但这样至少有两问题.

  1. 没有考虑数据量大的问题
  2. 没有考虑,如果在一个批次时,某个对象更新失败,会导致整个这个批次的其它数据受影响, 尤其是在一个批次中支持多个客户时,影响更大.

分组处理

为了把上面两个点考虑,在处理数据时,先对数据分组

  1. 新建一个包装类,两个属性

     class {
            private String objectType;
            private List<Sobject> sobjectList;
     }
    
  2. 新建Batch A ,用来对数据分组. 在开始方法中查询记录. 在执行方法中对处理后的数据通过Map 对数据分组,封装.按对象封装 如果数据量比较大,可以按一定的大小对数据切片封装,比如5000记录分一组

  3. Batch A 执行完所有批次后得到一个List<Class>的集合.传递给下一个Batch

  4. Batch B 拿到结果后,更新到DB中

这样做需要借多个Batch,如果数据量不大,可直接在开始方法中分组. 当对象A,B,C数据量很大时,可能出现内存超限,因为我们使用了全局变量存结果集 这样就只能按对象单独处理,先处理对象A,分组后将结果给BatchB,然后再处理对象B,C.这样处理如果一个批次出现错误,影响的只是同一个对象的数据.

另外不要试图不用对象,将Sobject 放到一个集合中,这样Batch B 在更新到DB中 会出现一个,分区不能超过10个的错误(错误名当时没有记),第一次见,原因是在dml时,貌似会对数据分组,把同一类型的数据分组,如果分组超过10个就运行时异常,这个还有个公式可以计算的,下次找到更新到这里

如果你有好的方法请留下你的脚印.

转载于:https://my.oschina.net/SpringZhang/blog/1528352

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值