Salesforce APEX中列表的最大大小

3

我创建了一个 DataBase.Batchable 类,其中我正在插入一个名为 Event__c 的自定义对象

public class BatchCreateGCalendars implements Database.Batchable<SObject>, Database.Stateful, Database.AllowsCallouts {
 private List<Event__c> event_id;
}

我正在创建1000条事件类型的记录,然后使用该语句。
insert event_id;

这样做好吗?还是逐个插入每个元素更合适?在我的自定义对象中,我只创建了一个文本类型(255)的自定义字段,那么列表的最大大小是多少?

3个回答

7

列表的大小没有明确的限制。我认为你最终会遇到的限制是堆大小,目前批处理作业的堆大小为12 MB。但是,你需要注意通过DML可以处理的记录数量,目前为10,000条。


3

这里有两个问题。

1) 如果可能的话,总是使用对象列表进行DML语句。这将执行得更快,并帮助您避免管理限制。(如果您还没有,请确实查看它们)

2) 编辑: 几年前只有1K,现在只是一个堆大小,就像Jeremy写的一样。但是,传递给Visualforce的集合仍然有1K(如果它是readonly="true"页面,则为10K),而所有查询返回的最大行数为50K。


2
#2 - 不是了,已经取消了。几年前还有1K的限制,现在只是一个堆大小,正如Jeremy所写的那样。但是,如果传递给Visualforce的集合仍然有1K的限制(如果是带有readonly="true"的页面,则为10K),并且所有查询返回的最大行数为50K。 - eyescream

0
Salesforce在Visualforce组件上保留了1000个限制,因为大型数据表的重新渲染性能非常差,可能会导致浏览器冻结,需要注意。
使用上述解决方法后,您需要注意的限制是堆大小,因为列表开始变得很大。如果数据太大,建议使用过滤(在SOQL上)来减少需要返回到浏览器的数据。(Select2可以解决这个问题)
有几种解决方法。以下是其中的一些...
- 使用行和第一个参数设置显示数据的偏移量和限制:
<apex:repeat value="{!myCollection}" var="item" rows="1000" first="0">
{!item.text}
</apex:repeat>
<apex:repeat value="{!myCollection}" var="item" rows="1000" first="1000">
{!item.text}
</apex:repeat>
<apex:repeat value="{!myCollection}" var="item" rows="1000" first="2000">
{!item.text}
</apex:repeat>

-使用包装器:

Visualforce页面:

 <apex:page controller="thousandLimit">    
        <apex:pageBlock >
            <apex:repeat value="{!thousandBlocks}" var="block">
                <apex:pageBlockTable value="{!block.Accounts}" var="a">
                    <apex:column value="{!a.Name}"/>                
                </apex:pageBlockTable>
            </apex:repeat>
        </apex:pageBlock>  
    </apex:page>

控制器:

public class thousandLimit
    {
        private limitWrapper[] thousandBlocks = new limitWrapper[]{};

        private final integer listLimit;

        public thousandLimit()
        {
            listLimit = 999;
        }

        public limitWrapper[] getthousandBlocks()
        {
            thousandBlocks = new limitWrapper[]{};

            integer counter = 0;
            integer loopCount = 0;
            Account[] tmpAccount = new Account[]{};

            for(Account a:[SELECT Id, Name FROM Account])
            {
                if(counter < listLimit)
                {
                    tmpAccount.add(a);
                    counter++;
                }
                else
                {
                    loopCount++;
                    thousandBlocks.add(new limitWrapper(tmpAccount,loopCount));
                    tmpAccount = new Account[]{};
                    tmpAccount.add(a);
                    counter = 0;
                }            
            }

            if(thousandBlocks.size() == 0)
            {
                loopCount++;
                thousandBlocks.add(new limitWrapper(tmpAccount,loopCount));
            }

            return thousandBlocks;
        }

        public class limitWrapper
        {
            public Account[] accounts {get;set;}
            public integer blockNumber {get;set;}
            public limitWrapper(Account[] accs, integer i)
            {
                accounts = accs;
                blockNumber = i;
            }

        }
    }

-您可以使用readonly标签将其从1k增加到10k

<apex:page controller="thousandLimit" readonly="true">
   <apex:pageBlock >
      <apex:repeat value="{!thousandBlocks}" var="block">
            <apex:pageBlockTable value="{!block.cases}" var="c">
            <apex:column value="{!c.CaseNumber}"/>
            <apex:column value="{!c.owner.name}"/>
            <apex:column value="{!c.App_Process__c}"/>
            <apex:column value="{!c.Load__c}"/>
            <apex:column value="{!c.subject}"/>
            <apex:column value="{!c.Estimated_Completion_Date__c}"/>   
            <apex:column value="{!c.Complete__c}"/>
            <apex:column value="{!c.Priority}"/>
            <apex:column value="{!c.Case_Age_Days__c}"/>                    
            </apex:pageBlockTable>
        </apex:repeat>
     </apex:pageBlock>  
</apex:page>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接