如何在Apex类中调用批处理实现超1万条数据的DML操作?
解决Apex中DML行数超限问题:直接调用批处理完成大量数据的Insert/Update
一、编写批处理类(实现Database.Batchable接口)
批处理类会自动将大数据集拆分为多个批次执行,每批次DML行数不超过上限(默认200,最大可设2000),从而避开Too many DML rows: 10001错误。根据数据来源不同,分两种场景实现:
场景1:处理数据库查询的数据(Update操作)
如果要处理的数据来自SOQL查询,用QueryLocator定义数据范围:
public class LargeDataUpdateBatch implements Database.Batchable<SObject> { // 定义要处理的数据范围 public Database.QueryLocator start(Database.BatchableContext bc) { // 替换为你的目标查询,比如筛选需要更新的记录 return Database.getQueryLocator([SELECT Id, Description FROM Contact WHERE Email != null]); } // 处理每一批数据的DML操作 public void execute(Database.BatchableContext bc, List<SObject> scope) { for(SObject obj : scope) { Contact con = (Contact)obj; con.Description = 'Updated on ' + System.now(); } // 每批仅处理当前scope内的数据,不会触发行数超限 update scope; } // 批处理完成后的收尾操作(可选) public void finish(Database.BatchableContext bc) { System.debug('批量更新执行完成'); } }
场景2:处理内存中的数据集(Insert操作)
如果数据是在内存中生成的(比如外部接口返回、批量构造的对象),通过构造方法传入数据集,用Iterable<SObject>返回:
public class LargeDataInsertBatch implements Database.Batchable<SObject> { private List<SObject> targetData; // 构造方法接收要插入的数据集 public LargeDataInsertBatch(List<SObject> dataList) { this.targetData = dataList; } public Iterable<SObject> start(Database.BatchableContext bc) { return targetData; } public void execute(Database.BatchableContext bc, List<SObject> scope) { insert scope; } public void finish(Database.BatchableContext bc) { System.debug('批量插入执行完成'); } }
二、在目标Apex类中直接调用批处理
无需调度,直接在业务类中实例化批处理类,调用Database.executeBatch()触发执行:
调用查询型批处理(Update场景)
public class BusinessService { public static void runLargeUpdate() { LargeDataUpdateBatch updateBatch = new LargeDataUpdateBatch(); // 可选指定批大小(最大2000),不指定则用默认200 Database.executeBatch(updateBatch, 2000); } }
调用内存数据批处理(Insert场景)
public class DataGenerationService { public static void generateAndInsertLargeData() { List<Account> accountList = new List<Account>(); // 构造15000条测试数据(超过10000行限制) for(Integer i = 0; i < 15000; i++) { accountList.add(new Account(Name='Demo Account ' + i)); } LargeDataInsertBatch insertBatch = new LargeDataInsertBatch(accountList); Database.executeBatch(insertBatch, 2000); } }
三、关键注意事项
- 批处理调用限制:同步Apex中最多调用5次
Database.executeBatch(),异步环境最多25次;若需处理极大量数据,可在finish()方法中链式触发下一批处理。 - 批大小设置:最大可设为2000,根据业务逻辑调整(比如复杂逻辑用较小批大小避免CPU超时)。
- 测试覆盖:编写测试类时,需用
Test.startTest()和Test.stopTest()包裹批处理调用,确保批处理逻辑被执行并验证结果。
内容的提问来源于stack exchange,提问作者hinako
相关产品推荐
相关产品推荐

