From d455707dbc356d30065e8fb5b5fe1ea0ad2a3d4e Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Thu, 29 May 2025 20:59:49 +0700 Subject: [PATCH] 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 --- app/Jobs/ProcessStmtEntryDataJob.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/Jobs/ProcessStmtEntryDataJob.php b/app/Jobs/ProcessStmtEntryDataJob.php index a9d5d63..11e129b 100644 --- a/app/Jobs/ProcessStmtEntryDataJob.php +++ b/app/Jobs/ProcessStmtEntryDataJob.php @@ -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 = [];