Batch Apex là một công cụ mạnh mẽ trong Salesforce, cho phép bạn xử lý hàng ngàn, thậm chí hàng triệu bản ghi một cách hiệu quả. Bài viết này sẽ đi sâu vào Batch Apex, giải thích khi nào nên sử dụng, cách viết code, và những lưu ý quan trọng để đảm bảo hiệu suất tốt nhất. Nếu bạn đang làm việc với lượng lớn dữ liệu trong Salesforce, đây là bài viết bạn không thể bỏ qua.
Batch Apex là một tính năng trong Salesforce cho phép bạn chia một công việc lớn thành các lô (batch) nhỏ hơn, có thể quản lý được và xử lý chúng một cách riêng biệt. Điều này đặc biệt hữu ích khi bạn cần thực hiện các thao tác như cập nhật, xóa, hoặc xử lý dữ liệu trên số lượng lớn bản ghi, vượt quá giới hạn thông thường của Salesforce. Việc chia nhỏ giúp tránh các lỗi liên quan đến governor limits và đảm bảo quá trình xử lý diễn ra suôn sẻ.
Ví dụ, nếu bạn cần cập nhật thông tin của tất cả khách hàng trong hệ thống (ví dụ, hàng triệu bản ghi), việc thực hiện thao tác này trong một transaction duy nhất sẽ rất khó khăn, thậm chí không thể. Batch Apex cho phép bạn chia công việc này thành nhiều batch nhỏ, mỗi batch xử lý một số lượng bản ghi nhất định (ví dụ, 200 bản ghi). Điều này giúp giảm tải cho hệ thống và đảm bảo rằng quá trình cập nhật diễn ra thành công.
Batch Apex phù hợp với các tình huống sau:
Một ví dụ thực tế là gửi email thông báo cho người dùng 90 ngày trước khi hợp đồng hết hạn hoặc tạo cơ hội gia hạn dựa trên ngày kết thúc hợp đồng. Những tác vụ này có thể được thực hiện hiệu quả bằng Batch Apex.
Để viết một lớp Batch Apex, lớp của bạn phải implements interface `Database.Batchable` và bao gồm ba phương thức sau:
records)`
: Phương thức này thực hiện xử lý cho mỗi batch dữ liệu. Kích thước batch mặc định là 200 bản ghi. Các batch không đảm bảo sẽ được thực hiện theo thứ tự nhận được từ phương thức `start()`.Dưới đây là một ví dụ đơn giản về một lớp Batch Apex cập nhật tên của tất cả các tài khoản:
global class AccountUpdateBatch implements Database.Batchable<sObject> {
global Database.QueryLocator start(Database.BatchableContext bc) {
String query = 'SELECT Id, Name FROM Account';
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext bc, List<Account> scope) {
for (Account acc : scope) {
acc.Name = acc.Name + ' - Updated by Batch';
}
update scope;
}
global void finish(Database.BatchableContext bc) {
// Gửi email thông báo
}
}
Để gọi một lớp Batch Apex, hãy khởi tạo nó và sau đó gọi `Database.executeBatch` với instance đó:
AccountUpdateBatch aub = new AccountUpdateBatch();
Id batchId = Database.executeBatch(aub, 200); // 200 là kích thước batch
Tham số thứ hai (scope) là tùy chọn và chỉ định số lượng bản ghi được chuyển vào phương thức `execute()` cho mỗi batch. Nếu bạn gặp phải governor limits, hãy giảm kích thước batch.
Thông thường, Batch Apex là stateless. Mỗi lần thực thi một công việc Batch Apex được coi là một transaction riêng biệt. Nếu bạn muốn duy trì trạng thái (state) giữa các transaction, hãy implements interface `Database.Stateful`. Khi sử dụng `Database.Stateful`, chỉ các biến thành viên instance mới giữ lại giá trị của chúng giữa các transaction. Điều này hữu ích cho việc đếm hoặc tóm tắt các bản ghi khi chúng được xử lý.
global class StatefulBatch implements Database.Batchable<sObject>, Database.Stateful {
global Integer recordsProcessed = 0;
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator('SELECT Id FROM Account');
}
global void execute(Database.BatchableContext bc, List<Account> scope) {
for (Account acc : scope) {
recordsProcessed++;
}
}
global void finish(Database.BatchableContext bc) {
System.debug('Total records processed: ' + recordsProcessed);
}
}
Để đảm bảo hiệu suất tốt nhất khi sử dụng Batch Apex, hãy lưu ý những điều sau:
Batch Apex là một công cụ quan trọng cho việc xử lý lượng lớn dữ liệu trong Salesforce. Bằng cách hiểu rõ cú pháp, cách triển khai, và các best practices, bạn có thể tận dụng tối đa sức mạnh của Batch Apex để giải quyết các bài toán phức tạp và nâng cao hiệu suất hệ thống của mình.
Bài viết liên quan