我正在尝试在batchable类的finish()方法中使用全局Map变量,但它表现得很奇怪,我确定我做错了什么,但不知道在哪里。 在下面的简化代码中,第一个调试消息按预期输出映射的实际大小。但是,finish()方法中的调试消息输出0,作为相同映射的大小。看起来地图会在某个地方重新实例化,但我不知道在哪里。
global class MySchedulableClass implements Database.Batchable<sObject> {
global map<string,string> StringStringMap;
global string query;
global MySchedulableClass(){
if (query == null)
query = 'Select id, name From Contact LIMIT 20';
if (StringStringMap == null){
StringStringMap = new map<string,string>();
}
}
global Database.QueryLocator start(Database.BatchableContext BC){
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext BC,List<sObject> scope){
for(Sobject s: scope) {
con = (Contact) s;
StringStringMap.put(s.id, s.name);
}
system.debug('Map size:' + StringStringMap.size());
}
global void finish(Database.BatchableContext BC){
system.debug('Map size:' + StringStringMap.size());
}
}
答案 0 :(得分:2)
如果要在批处理运行期间保留信息,请查看Database.Stateful。见Using State in Batch Apex。它涵盖了您的全局变量不持久的原因。
批处理Apex作业的每次执行都被视为离散事务。例如,包含1,000条记录并且在没有可选范围参数的情况下执行的批处理Apex作业被视为五个事务,每个事务有200条记录。
如果在类定义中指定Database.Stateful,则可以跨这些事务维护状态。