我们在处理大规模数据时,经常会发生各种限制。但是使用Apex Batch会将需要处理的数据,分割开来执行。
也就是进行异步处理数据,而不会超出平台的限制。
同步和异步的概念:
生活中,同步就是表示两件事请同时做,比如一边听歌一边学习写作业。这两件事是同时进行。
生活中,异步就是表示两件事请有先后顺序,只能是先听歌,听完歌之后再学习写作业。这两件事是有顺序的进行。
软件程序中,完全是相反的,也就是同步是有顺序经进行,异步是同时进行。
同步:每个程序处理都是有顺序的,不能跨越执行,比如用户必须先注册,然后才可以登录,这个流程不能变。
异步:程序只是发送调用的指令,不用等待被调用的方法完全执行完,而是会继续执行下一个程序。就像打开一个页面,是边加载边显示在页面上。
同步是需要等待,异步不需要等待。
看一下英文表示,同步:Synchronize,异步:Asynchronous
批处理Apex语法
实现 :Database.Batchable 接口
和三个方法:
start()
global (Database.QueryLocator | Iterable) start(Database.BatchableContext bc) {}
Apex Batch开始,在Apex批处理作业的开始处被调用一次,收集并返回处理的对象或记录。
使用QueryLocator对象时,将忽略SOQL查询检索到的记录总数的限制条件限制,并且最多可以查询5000万条记录。
使用Iterable对象时,SOQL查询检索的记录总数的限制条件限制仍然适用。
execute()
global void execute(Database.BatchableContext BC, list
){}
接收start()传过来的对象或记录,默认批处理大小为200条记录。200条执行一次。
批处理记录开始它们倾向于按照从方法中接收到的顺序执行。但是,执行记录批处理的顺序取决于各种因素。无法保证执行顺序。
finish ()
global void finish(Database.BatchableContext BC){}
用于执行后处理操作(例如发送邮件,日志登录,调用其他Batch等),并且在处理完所有批次后调用一次。
批处理Apex类的框架如下:
global class MyBatchClass implements Database.Batchable<sObject> {
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {
// collect the batches of records or objects to be passed to execute
}
global void execute(Database.BatchableContext bc, List<P> records){
// process each batch of records
}
global void finish(Database.BatchableContext bc){
// execute any post-processing operations
}
}
调用批处理类
MyBatchClass myBatchObject = new MyBatchClass();
Id batchId = Database.executeBatch(myBatchObject,200);
每次调用Batch Apex时,都会创建一个AsyncApexJob记录,以便跟踪工作进度。可以通过SOQL查看进度并管理Apex作业队列中的作业。
AsyncApexJob job = [SELECT Id, Status, JobItemsProcessed, TotalJobItems, NumberOfErrors FROM AsyncApexJob WHERE ID = :batchId ];
下面看一个具体的例子,
当环境中有许多操作在一个对象上时,例如PB,Flow,Trigger等,我们对这个对象进行数据移行