2

我正在尝试在可批处理类的 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());
    }
}
4

1 回答 1

3

如果您想在批处理运行期间保留信息,请查看 Database.Stateful。请参阅在 Batch Apex 中使用状态。它涵盖了为什么您的全局变量不持久。

批处理 Apex 作业的每次执行都被视为一个离散事务。例如,包含 1,000 条记录并且在没有可选范围参数的情况下执行的批处理 Apex 作业被视为五个事务,每个事务有 200 条记录。

如果在类定义中指定 Database.Stateful,则可以跨这些事务维护状态。

于 2013-08-06T10:33:21.987 回答