【Salesforce】バッチ処理の各トランザクションの値を保持する

【Salesforce】バッチ処理の各トランザクションの値を保持する

Salesforceでバッチ処理を作成したり、修正したりするときに見ることがあるインターフェースに「Database.Stateful」というものがあります。

大体は修正するときに見るものなのですが、いつも何だったか忘れてしまうのでメモです。

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_batch_interface.htm

ご存じのとおり、Apexのバッチ処理は200件ごとに処理されるため、個別のトランザクションで動作します。

そのため、バッチクラスのメンバ変数は各トランザクションごとにリセットされてしまいます。

しかし、「Database.Stateful」インターフェースを利用することによってその値をリセットされないように出来るんだとか。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
global class SummarizeAccountTotal implements
Database.Batchable<sObject>, Database.Stateful{
 
global final String Query;
global integer Summary;
 
global SummarizeAccountTotal(String q){Query=q;
Summary = 0;
}
 
global Database.QueryLocator start(Database.BatchableContext BC){
return Database.getQueryLocator(query);
}
 
global void execute(
Database.BatchableContext BC,
List<sObject> scope){
for(sObject s : scope){
Summary = Integer.valueOf(s.get('total__c'))+Summary;
}
}
 
global void finish(Database.BatchableContext BC){
}
}

上のURLの例でいくと、Summaryというメンバ変数をトランザクション間で集計に利用しているようです。

「Database.Stateful」を利用しない場合は毎回0にリセットされるようですね。

静的な変数については保持しない、というのは知りませんでした。

初期化以外で値を設定することはないと思いますが。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です