一括処理バッチ

  • 一括処理バッチの特徴として、以下が挙げられます。
    • 大量データを扱ってもガバナ制限を超過しにくい
    • 非同期処理として実行できる

まず、一括処理バッチは大量のデータを処理する際に有効です。
例えば、SOQL クエリによって取得されるレコードの合計数は50000件が上限ですが、一括処理バッチでは最大5000万件まで一度に取得することができます。

さらに、取得したレコードに対して一定数ごとにレコードを分割して処理を実行します。各処理は別トランザクションとなるため、ガバナ制限のカウントは毎回リセットされます。

したがって、一括処理バッチを用いることで大量データをガバナ制限を超過しないように処理することができるようになります。

また、一括処理バッチ使用すると非同期処理になります。したがって処理に時間がかかったとしても、ユーザはその間別の画面操作をすることができます。

以上の特徴から、大量データや、時間のかかる処理に対して力を発揮する機能だと言えます。

graph TB subgraph 処理 star[start 処理するデータをクエリ] --> executeA[execute クエリしたデータから
バッチサイズ分のレコードを取り出す] executeA --> executeB[execute データに対して処理を実行] executeB --> finish[finish データ処理が全て終わった後の処理] executeB -- 指定したバッチサイズ-デフォルト200レコード-で繰り返す --> executeA end

start() では、処理したいデータをクエリして返すようにします。返り値は Database.QueryLocator または Iterable(普通のリストの形など)のどちらかを返します。Database.QueryLocator を返すようにすると、最大5000万件まで取得することができます。

しかし、Database.QueryLocator を返す場合は、集計関数(GROUP BYなど)を使うことができません。集計関数を使いたい時はIterable を返すようにします。Iterable では通常のガバナ制限がそのまま適用されますが、このように柔軟に対応することができます。

execute() では、start() でクエリしてきたデータに対しての処理を記述します。execute() の処理はクエリしたデータを数件ごとに分割して実行されます。

    public class SampleBatch implements Database.Batchable<sObject> {
        global final List<Id> IdList;
        // コンストラクタ
        global QuoteDtlInsUpdDelItemDelete(List<id> TempIdList){
            IdList=TempIdList;
        } 

        /* Database.QueryLocator を使う場合 */
        public Database.QueryLocator start(Database.BatchableContext bc) {
            // レコードをクエリ
           String query = 'SELECT Id, SakujyoFlag__c From Item';
           return Database.getQueryLocator(query);
        }

        public void execute(Database.BatchableContext bc, List<P> records){
            // レコードに対する処理を記述
        }
        public void finish(Database.BatchableContext bc){
            // バッチ終了時の処理を記述
        }
    }
  • バッチの実行方法
    バッチサイズを指定して実行することもできます。
    SampleBatch i = new SampleBatch(DelIdList);
    Database.executeBatch(i, 1000);