Activity Forums Salesforce® Discussions what is the use of Database.Stateful in Salesforce Batch Class?

  • Sudhir

    Member
    July 11, 2017 at 2:52 pm

    I think you can do a little bit of searching inside Salesforce Apex Developer Guide to get this answer.

    Each execution of a batch Apex job is considered a discrete transaction. For example, a batch Apex job that contains 1,000 records and is executed without the optional scope parameter is considered five transactions of 200 records each.

    If you specify Database.Stateful in the class definition, you can maintain state across these transactions. When using Database.Stateful, only instance member variables retain their values between transactions. Static member variables don’t retain their values and are reset between transactions. Maintaining state is useful for counting or summarizing records as they’re processed. For example, suppose your job processed opportunity records. You could define a method in execute to aggregate totals of the opportunity amounts as they were processed.

    If you don’t specify Database.Stateful, all static and instance member variables are set back to their original values.

    #copied #Salesforce_Apex_Developer_Guide

    Is there any specific answer you are seeking for? Please ask.

  • Aman

    Member
    July 11, 2017 at 2:57 pm

    Each execution of a batch Apex job is considered a discrete transaction. For example, a batch Apex job that contains 1,000 records and is executed without the optional scope parameter is considered five transactions of 200 records each.

    If you specify Database.Stateful in the class definition, you can maintain state across these transactions. When using Database.Stateful, only instance member variables retain their values between transactions. Static member variables don’t retain their values and are reset between transactions. Maintaining state is useful for counting or summarizing records as they’re processed. For example, suppose your job processed opportunity records. You could define a method in execute to aggregate totals of the opportunity amounts as they were processed.

    If you don’t specify Database.Stateful, all static and instance member variables are set back to their original values.

    The following example summarizes a custom field total__c as the records are processed.

    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){
        }
    }
  • saloni gupta

    Member
    July 12, 2017 at 4:26 am

    thanks sudhir, Can you give any example for this scenario ?

  • Sudhir

    Member
    July 12, 2017 at 8:21 am

    Look at the example in the Aman's response above.

  • Parul

    Member
    September 19, 2018 at 6:24 pm

    Adding some more point:

    Hi

    Implementing database.stateful will maintain your state so the map that you are using in execute method will contain all the error messages after the completion of execute method.In finish method you will have aggregate of all errors that can be finally used .

    Thanks

  • shariq

    Member
    September 19, 2018 at 11:02 pm

    Hi,

    The only time you need Database.Stateful is when the execute method modifies a class variable in a way meant to be used across multiple execute methods or in the finish method. The majority of batches you will ever write will not need Database.Stateful. It's important to know that using Database.Stateful will harm your batch's performance, because the class will be serialized at the end of each execute method to update its internal state. This extra serialization results in longer execution time.

    If you're ever not sure if you need it, simply ask yourself two questions: (1) "Does one execute method need data from a previous execute method?", and (2) "Does the finish method need data from any previous execute method?" If the answer to both of these questions is no, then you do not need Database.Stateful. If the answer is yes, then you may want to use Database.Stateful. Keep in mind that there are alternative means to using Database.Stateful, such as storing data in a Custom Setting, which may offer better performance in some cases.

    Hope this helps.

  • Vijay Kumar H R

    Member
    November 9, 2018 at 1:03 pm

    scenario like:- for all the contacts for their birthday if you want to send email, that time you can use this to fetch all email id's of contacts which are running in batches.

Log In to reply.

Popular Salesforce Blogs