refactor(webstatement): optimalkan proses penyimpanan batch dalam ProcessStmtEntryDataJob
- Menghapus logika `updateOrCreate` dan menggantinya dengan penghapusan (`delete`) berdasarkan `stmt_entry_id` sebelum melakukan operasi `insert`. - Menambahkan pembagian proses ke dalam chunk yang lebih kecil untuk manajemen memori yang lebih baik. - Memastikan semua `stmt_entry_ids` dalam chunk diekstrak dan digunakan untuk meminimalisir konflik data. - Menambah logging yang lebih detail dengan `e.getTraceAsString()` untuk mempermudah debugging ketika terdapat error. - Membersihkan `entryBatch` baik setelah proses sukses maupun ketika terjadi kesalahan untuk mencegah reprocessing pada data yang sama. Perubahan ini bertujuan untuk meningkatkan efisiensi dan memastikan integritas data selama proses penyimpanan batch. Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
This commit is contained in:
@@ -191,18 +191,23 @@
|
||||
{
|
||||
try {
|
||||
if (!empty($this->entryBatch)) {
|
||||
// Process in smaller chunks for better memory management
|
||||
foreach ($this->entryBatch as $entry) {
|
||||
StmtEntry::updateOrCreate(
|
||||
['stmt_entry_id' => $entry['stmt_entry_id']], // Find by this key
|
||||
$entry // Update or create with these values
|
||||
);
|
||||
// Extract all stmt_entry_ids from the current chunk
|
||||
$entryIds = array_column($entry, 'stmt_entry_id');
|
||||
|
||||
// Delete existing records with these IDs to avoid conflicts
|
||||
StmtEntry::whereIn('stmt_entry_id', $entryIds)->delete();
|
||||
|
||||
// Insert all records in the chunk at once
|
||||
StmtEntry::insert($entry);
|
||||
}
|
||||
|
||||
// Reset entry batch after processing
|
||||
$this->entryBatch = [];
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
Log::error("Error in saveBatch: " . $e->getMessage());
|
||||
Log::error("Error in saveBatch: " . $e->getMessage() . "\n" . $e->getTraceAsString());
|
||||
$this->errorCount += count($this->entryBatch);
|
||||
// Reset batch even if there's an error to prevent reprocessing the same failed records
|
||||
$this->entryBatch = [];
|
||||
|
||||
Reference in New Issue
Block a user