System.LimitException:Apex堆大小太大Salesforce
Map sObjectsToClone=子对象的映射及其关系名称 我必须批量克隆每个opportunity的给定儿童记录System.LimitException:Apex堆大小太大Salesforce,salesforce,apex,Salesforce,Apex,Map sObjectsToClone=子对象的映射及其关系名称 我必须批量克隆每个opportunity的给定儿童记录 void execute(Database.BatchableContext BC, List<Opportunity> batch) { List<Opportunity> OpportunityList = new List<Opportunity>(); for(Opportunity opp : batch) {
void execute(Database.BatchableContext BC, List<Opportunity> batch) {
List<Opportunity> OpportunityList = new List<Opportunity>();
for(Opportunity opp : batch) {
OpportunityList.add(opp);
}
insert OpportunityList;
List<sObject> childObjectStore = new List<sObject>();
for(sObject sob : sObjectsToClone.keySet()) {
//List<sObject> childObjectStore = new List<sObject>();
for(Opportunity sOppy : OpportunityList) {
sObject clone = sob.clone(false, true);
clone.put(sObjectsToClone.get(sob), sOppy.Id);
system.debug('Clone :: '+clone);
childObjectStore.add(clone);
}
//insert childObjectStore;
}
insert childObjectStore;
}
void执行(Database.BatchableContext-BC,List-batch){
列表机会列表=新列表();
对于(Opportunity opp:batch){
机会列表。添加(opp);
}
插入机会列表;
List childObjectStore=新列表();
for(sObject-sob:sObjectsToClone.keySet()){
//List childObjectStore=新列表();
for(Opportunity sOppy:OpportunityList){
sObject clone=sob.clone(false,true);
clone.put(sObjectsToClone.get(sob),sOppy.Id);
system.debug('Clone::'+Clone);
添加(克隆);
}
//插入childObjectStore;
}
插入childObjectStore;
}
如果OpportunityList的大小很小(比如10),则此代码可以正常工作,但如果OpportunityList的大小更大(比如超过100),则会抛出System.LimitException:Apex堆大小太大:
exception
请提出解决方案 在这段代码之前,我假设您有更多的逻辑,这段代码消耗了大量的堆。您是对的,Chiz,请查看编辑的帖子在这种情况下,我假设您用于检索Opportunity的查询包含很多字段,而不仅仅是Id(您在逻辑中使用的Id)。尝试减少查询中的字段数。您有三个Opportunity列表。首先是批量,然后是具有相同大小和。。。哦,你有一张机会地图。我相信它是有状态的。我认为您应该使用稳定范围(就一批中一次处理的元素数量而言)。感谢Chiz的快速回复,我在stackexchange上发布了与guest相同的问题,因此我无法在此处添加评论:(-这里您说过,它适用于小批量,但是如果我将批量设置为100,并执行代码,它将再次抛出相同的异常。