Salesforce 通过数据加载器使用大容量API时,每个触发器中仅获取相同的200条记录
我们已经为联系人记录编写了一个重复数据消除逻辑,其中我们从触发器中调用批处理作业。是的,这听起来很奇怪,但似乎是唯一有效的方法,因为我们对每个帐户都有不同的标准。为了克服5的批处理计划限制,我们使用启用批量API的数据加载器,并将natch大小设置为1000,这样我们就可以成功上载5000条记录,而不会达到5个批处理作业的限制。当我使用30万条联系人记录进行测试时,假设它们的名称从Test0001到Test3000,我观察到一种奇怪的行为 对于3000条记录,当批处理大小为1000时,3个批处理作业开始运行。我正在将参数中新插入的记录传递给有状态批处理类。我所期望的是,3个批处理作业中的每一个都将传递1000条记录,并将它们与我在batch的start方法中查询的重复项的现有记录进行比较,但我只得到Test0001到Test0200,即,从通过data loader API插入的1000条记录中,只有前200条记录在参数中传递给batch类,并且其余800人则不然。这有点奇怪,因为这意味着只有前200条记录是进程,如果我通过启用批量API的数据加载程序使用批量大小为1000的数据进行插入 你们中有没有人遇到过这个问题,或者对如何处理这个问题有什么想法可以分享?我也可以分享代码,但我认为问题更具概念性。非常感谢您的帮助 谢谢 编辑:这是我的代码:Salesforce 通过数据加载器使用大容量API时,每个触发器中仅获取相同的200条记录,salesforce,apex-code,visualforce,apex,apex-data-loader,Salesforce,Apex Code,Visualforce,Apex,Apex Data Loader,我们已经为联系人记录编写了一个重复数据消除逻辑,其中我们从触发器中调用批处理作业。是的,这听起来很奇怪,但似乎是唯一有效的方法,因为我们对每个帐户都有不同的标准。为了克服5的批处理计划限制,我们使用启用批量API的数据加载器,并将natch大小设置为1000,这样我们就可以成功上载5000条记录,而不会达到5个批处理作业的限制。当我使用30万条联系人记录进行测试时,假设它们的名称从Test0001到Test3000,我观察到一种奇怪的行为 对于3000条记录,当批处理大小为1000时,3个批处理
This is the call from after insert triiger -->
ContactTriggerHandler trgHandler = new ContactTriggerHandler();
trgHandler.deDupAndCreateOfficebyBatch(accountIdContactMap);
//accountIdContactMap is the map which contains List of new contacts w.r.t thier account.
This is the call from handler class -->
public void deDupAndCreateOfficebyBatch (Map<String,List<Contact>> accountIdContactMap){
ContactDeDuplicationBatch batchObj = new ContactDeDuplicationBatch(accountIdContactMap);
String jobId = Database.executeBatch(batchObj,100);
}
This is the batch -->
global class ContactDeDuplicationBatch implements Database.Batchable<sObject>, Database.Stateful{
//set of duplicate contacts to delete
global Set<Contact> duplicateContactSet;
//Map of list of new contacts with account id as key
global Map<String,List<Contact>> newAccIdContactMap;
/*Constructor*/
public ContactDeDuplicationBatch(Map<String,List<Contact>> accountIdContactMap){
System.Debug('## accountIdContactMap size = '+ accountIdContactMap.keySet().size());
newAccIdContactMap = accountIdContactMap;
duplicateContactSet = new Set<Contact>();
}
/*Start Method */
global Database.QueryLocator start(Database.BatchableContext BC){
System.Debug('## newAccIdContactMap size = '+ newAccIdContactMap.keySet().size());
if(newAccIdContactMap.keySet().size() > 0 && newAccIdContactMap.values().size() > 0){
//Fields to be fetched by query
String fieldsToBeFetched = 'Id, AccountId ';
//Add account Id's for contacts which are to be matched
String accountIds = '(';
for(String id : newAccIdContactMap.keySet()){
if(accountIds == '('){
accountIds += '\''+id+'\'';
}else{
accountIds += ', \''+id+'\'';
}
}
accountIds += ')';
String query = 'SELECT '+fieldsToBeFetched+' FROM Contact WHERE Target_Type__c <> \'Office\' AND AccountId IN '+accountIds;
return Database.getQueryLocator(query);
} else {
return null;
}
}
/*Execute Method */
global void execute(Database.BatchableContext BC, List<sObject> scope){
System.Debug('## scope.zixe '+scope.size());
System.Debug('## newAccIdContactMap.zixe '+newAccIdContactMap.size());
//In My execute method I get only 200 records in newAccIdContactMap per batch
}
/*Finish Method */
global void finish(Database.BatchableContext BC){
//Some logic using the two global variables
}
}
在我的execute方法中,每批在newAccIdContactMap中仅获得200条记录
感谢您,触发器最多以200条记录为一批进行处理,因此对于1000条记录的批量加载,您的触发器将被调用5次,其中包含5组不同的200条记录。批顶点限制5适用于计划进程和正在运行的进程
从触发器执行batch apex时,应该非常小心。你几乎总是会达到极限。最好先加载数据,然后再运行批处理,而不是从触发器运行批处理,以便一次处理所有内容。在这种情况下,从触发器调用的批处理作业应调用15次200*15,用于3000条记录,我将达到5个批处理作业的限制。但这并没有发生,对于3000条记录,只有3个批处理作业正在运行,因为数据加载器中的批处理大小为1000。我只想将这1000条记录作为参数传递给batch类,但我得到的是前200条。其余800人去哪里?下一个作业从Test1000到Test1200获取记录。