From 66703a3a295747b54406a9ab2dd8504daf6e20db Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Fri, 21 Sep 2018 05:38:21 +0200 Subject: [PATCH] FIX: recursive BatchedPstmtHolder.flush, when BeanPersistController or ChangeLogFilter hit the database (#1486) --- .../server/persist/BatchedPstmtHolder.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/persist/BatchedPstmtHolder.java b/src/main/java/io/ebeaninternal/server/persist/BatchedPstmtHolder.java index 100b2ff21..3ac38f6c0 100644 --- a/src/main/java/io/ebeaninternal/server/persist/BatchedPstmtHolder.java +++ b/src/main/java/io/ebeaninternal/server/persist/BatchedPstmtHolder.java @@ -110,7 +110,15 @@ public class BatchedPstmtHolder { // but still need to close PreparedStatements. boolean isError = false; - for (BatchedPstmt bs : stmtMap.values()) { + // if there are Listeners/Controllers that interact with the database, + // the flush may get called recursively in executeBatch/postExecute. + // which leads that we process stmtMap.values() twice in the loop. + // So we copy the values, that we want to flush and clear it immediately. + BatchedPstmt[] values = stmtMap.values().toArray(new BatchedPstmt[stmtMap.values().size()]); + clear(); + + // this loop + for (BatchedPstmt bs : values) { try { if (!isError) { bs.executeBatch(getGeneratedKeys); @@ -139,8 +147,6 @@ public class BatchedPstmtHolder { } } - // clear the batch cache - clear(); if (firstError != null) { String msg = "Error when batch flush on sql: " + errorSql;