Salesforce 通过数据加载器使用大容量API时,每个触发器中仅获取相同的200条记录

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个批处理

我们已经为联系人记录编写了一个重复数据消除逻辑,其中我们从触发器中调用批处理作业。是的,这听起来很奇怪,但似乎是唯一有效的方法,因为我们对每个帐户都有不同的标准。为了克服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的数据进行插入

你们中有没有人遇到过这个问题,或者对如何处理这个问题有什么想法可以分享?我也可以分享代码,但我认为问题更具概念性。非常感谢您的帮助

谢谢

编辑:这是我的代码:

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获取记录。