ブログ

Apexバッチとは 大量データ処理の書き方やフローとの使い分けを分かりやすく解説

#Salesforce #Apexバッチ #書き方

積極採用中
セミナー情報

Salesforceでは、データの定期更新や不要データの削除など、レコードをまとめて処理したい場面があります。こうした処理は、フローやデータローダーでも対応できるケースがありますが、対象件数が多い場合や処理が複雑な場合は、ガバナ制限や運用負荷を考慮して実装方法を選ぶことが重要です。
フローでは一度に取得できるレコード数に上限がありますが、Apexバッチは処理を分割して実行できるため、大量のレコードを定期的に扱う場合に適しています。
本記事では、Apexバッチの基本的な仕組みと書き方を、サンプルコードを用いて解説します。あわせて、フローとの使い分けの考え方や、処理件数の目安についても整理します。

Apexバッチとは

Apexバッチは、Salesforceで大量のレコードを効率的に処理するための非同期処理の仕組みです。
処理対象となるレコードを一定の件数ごとに分割し、複数回に分けて実行することで、ガバナ制限の影響を抑えながら大規模なデータ処理を行えます。
Apexバッチは、データの一括更新や削除、定期的なクレンジング処理など、件数が多く、かつ自動化したい処理に適しています。また、処理の途中でエラーが発生した場合でも、トランザクション単位で実行されるため、影響範囲を限定できる点も特徴です。
このように、Apexバッチは大量データを安全に、計画的に処理したい場面で有効です。
ここからは、Apexバッチの具体的な書き方を解説します。まずは、Apexコードの作成や実行に使用する「開発者コンソール」について説明します。

開発者コンソールとは

開発者コンソールは、Salesforceが提供するブラウザベースの開発環境です。Apexコードの作成や実行、デバッグの確認などを、Salesforceの組織内で行えます。
ブラウザ上で利用できるため、専用のアプリケーションをインストールしたり、事前にツールを準備したりする必要はありません。Apexバッチの動作確認や簡単な開発を行う際に、手軽に利用できる点が特徴です。

開発者コンソールからApexバッチを作成する

以下の手順で、Apexバッチを作成するためのエディタ画面を開きます。

  1. ギアアイコンから開発者コンソールをクリック(Sandbox環境またはDeveloper Edition環境)
  2. 表示されたエディタ画面の左上部からFile>New>Apex Classの順で選択
  3. 新規に作成するApex Class名を入力し、OKボタンをクリック

Apexバッチを実装するための基本構造

Apexバッチで一括更新を実装するためには、Salesforceが提供するインターフェースの一つであるDatabase.Batchableがもつ3つのメソッドを活用する必要があります。

  • startメソッド
  • executeメソッド
  • finishメソッド

startメソッド

startメソッドは、Apexバッチで最初に呼び出されるメソッドを指します。

バッチ処理するレコードを取得し、executeメソッドに渡します。
executeメソッドに渡すオブジェクトは、Database.QueryLocator、またはIterableになります。通常はDatabase.QueryLocatorを使用しますが、外部連携や複雑なオブジェクト構造を扱いたいときにはIterableオブジェクトを使用します。

QueryLocatorを使用する場合、SOQLで最大5,000万件のレコードの取得ができます。
ただし、大量データを対象にする場合や検索条件が適切でない場合は、クエリ実行に時間がかかり、startメソッドでタイムアウトが発生する可能性があります。そのため、インデックス付き項目を検索条件に使用するなど、クエリが選択的になるよう設計することが重要です。

一方、Iterableを使用する場合は、SOQLで取得できるレコード総数のガバナ制限(最大 5万件)は引き続き適用されます。

executeメソッド

executeメソッドは、バッチ(データの処理単位)ごとに処理を実行するメソッドを指します。

処理するレコードは、startメソッドからバッチサイズに分割されて渡されます。
バッチサイズは省略可能で、デフォルトサイズは200です。

例えば、バッチサイズが200、startメソッドで2,000件のレコードを取得した場合、10個のトランザクションに分割され、executeメソッドが実行されます。ガバナ制限は、各トランザクション単位で適用されます。

finishメソッド

finishメソッドは、Apexバッチで最後に呼び出されるメソッドを指します。

すべてのバッチが処理された後、1回呼び出されます。
バッチ処理が終了したことを通知する確認メール送信など、後処理を行います。

上記の内容を理解したうえで、実際のサンプルコードを確認し、より理解を深めていきましょう。

Apexバッチのサンプルコード

以下のコードを実行すると、取引先(Account)オブジェクトを取得、説明(Description)項目を「Apexバッチによる更新」といった文字列で一括更新します。


public class UpdateAccountBatch implements Database.Batchable {

    public Database.QueryLocator start(Database.BatchableContext bc) {
        System.debug('*** start ***');
        return Database.getQueryLocator(
            'SELECT Id, Description FROM Account'
        );
    }

    public void execute(Database.BatchableContext bc, List scope) {
        System.debug('*** execute ***');

        List updList = new List();
        try {
            for (Account acc : scope) {
                acc.Description = 'Apexバッチによる更新';
                updList.add(acc);
            }
            if (!updList.isEmpty()) {
                update updList;
            }
        } catch (Exception e) {
            System.debug('Error: ' + e.getMessage());
            // 必要に応じてエラー通知やログ保存などを実装
        }
    }

    public void finish(Database.BatchableContext bc) {
        System.debug('*** finish ***');
    }
}

クラスの定義

public class UpdateAccountBatch implements Database.Batchable  { 

説明:Apexクラス名はUpdateAccountBatchで、Database.Batchableというインターフェースを実装しています。これは、Salesforceのデータベースでバッチ処理を実行するための標準的な方法です。

startメソッド:

public Database.QueryLocator start(Database.BatchableContext bc) {
    System.debug('*** start ***');
    return Database.getQueryLocator(
        'SELECT Id, Description FROM Account'
    );
}

説明:バッチの処理を開始するstartメソッドでは、Account(取引先)オブジェクトからId、Descriptionの情報を取得するクエリを実行し、その結果をQueryLocatorという形式で返しています。

executeメソッド:

public void execute(Database.BatchableContext bc, List scope) {
    System.debug('*** execute ***');

    List updList = new List();
    try {
        for (Account acc : scope) {
            acc.Description = 'Apexバッチによる更新';
            updList.add(acc);
        }
        if (!updList.isEmpty()) {
            update updList;
        }
    } catch (Exception e) {
        System.debug('Error: ' + e.getMessage());
        // 必要に応じてエラー通知やログ保存などを実装
    }
}

説明:バッチ処理における実際の作業を行います。このコードでは、startメソッドで実行された結果をバッチサイズに基づき、scopeリスト(acc)としてforループで回し、Descriptionを設定します。設定したaccを更新用のupdListリストに追加して、最後に更新を行います。

finishメソッド:

public void finish(Database.BatchableContext bc) {
    System.debug('*** finish ***');
}

説明:executeメソッドの後に呼び出され、バッチ処理の後処理を実行します。今回の例では、単純なデバッグメッセージを表示しています。

作成したApexバッチの保存方法

コードを記述したApex Classはエディタ画面のFile>Save Allで簡単に保存できます。

Apexバッチの実行方法

保存したサンプルコードを実行するためには、スケジュールクラスを作成し、実行タイミングを指定する必要がありますが、今回は「Anonymous Window(匿名ウィンドウ)」を使用してApexバッチを実行することとします。
※本番環境にリリースする場合、テストコードの作成が必要になります。

  • 開発者コンソールの上部にあるDebug>Open Execute Anonymous Windowを選択
  • (Ctrl + Eでも開けます。)

  • バッチを実行するコードを入力
  • 以下、バッチを実行するサンプルコードです。
    UpdateAccountBatch uab = new UpdateAccountBatch();
    Database.executeBatch(uab, 200);

  • Executeをクリック
  • エディタ画面下部のLogから成功とのみ出力されていれば、Apexバッチ処理が問題なく実行されました!

次からは、よくあるApexバッチによる一括更新の活用事例をいくつか見ていきましょう。

Apexバッチの活用事例

Apexバッチは、単に大量のレコードを処理するための仕組みではなく、処理件数や実行タイミング、ロジックの複雑さといった条件に応じて選択される実装手段です。
ここでは、実務でよく見られる代表的な活用例を通して、Apexバッチが適しているケースを具体的に紹介します。

1. 大量のデータの更新や削除

作成から一定期間が経過したデータの削除や、条件に合致するレコードの一括更新は、Apexバッチの代表的な活用例です。
スケジュール済みフローでもレコードの一括更新や削除を実装できますが、フローでは1つのトランザクション内で取得できるレコードの合計件数に5万件の上限があります。そのため、処理対象が5万件を超える場合は、フローでの実装は不向きです。
一方、Apexバッチは、数万件〜数百万件規模のデータも扱えるため、より多くのレコードを処理する場合は、Apexバッチが適しています。

2. 複雑なビジネスロジックの実行

複雑な計算ロジックや、条件分岐が多いビジネスロジック、高度なエラーハンドリングが必要な場合も、Apexバッチが有効です。
スケジュール済みフローでも一定のロジックは実装できますが、処理内容が複雑になるほど、フローの構成が分かりづらくなり、保守性が下がる傾向があります。
Apexバッチを利用することで、処理内容をコードとして明確に管理でき、複雑なロジックを伴う大量データ処理にも対応しやすくなります。

3. 外部システムとの統合

外部システムとのデータ連携においても、Apexバッチはよく利用されます。例えば、基幹システムやAmazonなどの他のクラウドから大量のデータを定期的に取り込み、Salesforceに反映するケースがあります。
このような連携では、1回の処理で数万件〜数百万件規模のデータを扱うことも珍しくありません。フローでは件数や処理量の面で制約が大きくなるため、処理を分割して実行できるApexバッチが適しています。

ご参考:Apexバッチの作成に慣れてきたシステム管理者向けポイント

1. バッチサイズの調整

Apexバッチは、1回のバッチ実行で処理されるレコード数を指定することができます。適切なバッチサイズを選択することで、システムの負荷軽減に寄与することができます。

2. エラーハンドリング

Apexバッチでは、エラーハンドリングが重要です。try-catchブロックを使用し、
例外ケースを表示、例外発生時も適切に業務ができる状態にすることが日々の運用で重要です。

3. テストコードの作成

Apexバッチは、テストコードも含めた開発が推奨されています。テストコードを用いて、バッチ処理の正確性やパフォーマンスを事前に確認することができます。

まとめ

Apexバッチは、Salesforceで大量のレコードを効率的かつ安定して処理するための仕組みです。本記事では、Apexバッチの基本的な仕組みや書き方を中心に、開発者コンソールを用いた実装手順やサンプルコードを通して解説しました。
また、活用事例では、フローとの使い分け、処理件数や実行タイミングによってApexバッチを選択すべきケースを具体的に紹介しました。大量データを定期的に扱う処理や、複雑なロジックを伴う処理では、Apexバッチが有効です。
自社のデータ量や運用要件に応じて、フローとApexバッチを適切に使い分ける参考にしてください。

<Salesforce>
弊社ではSalesforceをはじめとするさまざまな無料オンラインセミナーを実施しています!
>>セミナー一覧はこちら

また、弊社ではSalesforceの導入支援のサポートも行っています。ぜひお気軽にお問い合わせください。
>>Salesforceについての詳細はこちら
>>Salesforceの導入支援実績はこちらからご覧いただけます!

医療業界に特化した営業支援、顧客管理(SFA/CRM)のコンサルティングも提供しております。こちらもぜひお気軽にお問い合わせください。
>>顧客管理(SFA/CRM)のコンサルティングの詳細はこちら

CONTACT
お問い合わせ

ご相談やご依頼、病院マスタなどについてのお問い合わせはこちらのお問い合わせフォームから。

サービスなどについてのお問い合わせ 病院マスタについてのお問い合わせ

メールお問い合わせ