【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.