3

Event__cという名前のカスタムオブジェクトを挿入するDataBase.Batchableクラスを作成しました

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

たとえば、タイプイベントの1000レコードを作成してから、ステートメントを使用しています

insert event_id;

これは良いですか、それとも各要素を1つずつ挿入するのが適切ですか?カスタムオブジェクトで、text(255)タイプのカスタムフィールドを1つだけ作成しましたが、リストの最大サイズはいくつですか?

4

3 に答える 3

7

リストのサイズに定義された制限はありません。最終的に到達する制限はヒープサイズだと思います。これは現在、バッチジョブで12MBです。ただし、DMLを介して処理できるレコードの数(現在は10,000)に注意する必要があります。

于 2013-02-27T04:06:03.363 に答える
3

そこで2つの質問が組み合わされました。

1)はい、可能であれば、常にオブジェクトのリストを使用してDMLステートメントを実行してください。これはより速く実行され、知事の制限を回避するのに役立ちます。(まだチェックしていない場合は、実際にチェックする必要があります)

2)編集:数年前は1Kでしたが、現在はJeremyが書いているようにヒープサイズになっています。ただし、コレクション用に1Kがvisualforceに渡され(readonly = "true"のペー​​ジの場合は10K)、すべてのクエリで最大50K行が返されます。

于 2013-02-27T07:43:36.760 に答える
0

大きなdataTablesの再レンダリングのパフォーマンスがかなり悪く、ブラウザがフリーズする可能性があるため、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>
于 2019-07-05T14:16:38.703 に答える