From 4d82b86f81389845f489856a91c05968dd32e82e Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 13 Mar 2017 23:07:17 +1300 Subject: [PATCH] #993 - ENH: Add flush() to EbeanServer and Model to make it more accessible than the current transaction.flushBatch() --- src/main/java/io/ebean/EbeanServer.java | 13 +++++++++ src/main/java/io/ebean/Model.java | 11 ++++++++ src/main/java/io/ebean/Transaction.java | 8 ++++++ .../ebeaninternal/api/ScopedTransaction.java | 7 ++++- .../server/core/DefaultServer.java | 5 ++++ .../server/transaction/JdbcTransaction.java | 7 ++++- .../ebeaninternal/api/TDSpiEbeanServer.java | 5 ++++ .../transaction/TestBatchModelFlush.java | 27 +++++++++++++++++++ 8 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/tests/transaction/TestBatchModelFlush.java diff --git a/src/main/java/io/ebean/EbeanServer.java b/src/main/java/io/ebean/EbeanServer.java index 11c6ff5cd..22cb020ba 100644 --- a/src/main/java/io/ebean/EbeanServer.java +++ b/src/main/java/io/ebean/EbeanServer.java @@ -613,6 +613,19 @@ public interface EbeanServer { */ Transaction currentTransaction(); + /** + * Flush the JDBC batch on the current transaction. + *

+ * This only is useful when JDBC batch is used. Flush occurs automatically when the + * transaction commits or batch size is reached. This manually flushes the JDBC batch + * buffer. + *

+ *

+ * This is the same as currentTransaction().flush(). + *

+ */ + void flush(); + /** * Commit the current transaction. */ diff --git a/src/main/java/io/ebean/Model.java b/src/main/java/io/ebean/Model.java index 6bead3e98..b0f29b968 100644 --- a/src/main/java/io/ebean/Model.java +++ b/src/main/java/io/ebean/Model.java @@ -190,6 +190,17 @@ public abstract class Model { db().save(this); } + /** + * Flush any batched changes to the database. + *

+ * When using JDBC batch flushing occurs automatically at commit() time or when the batch size + * is reached. This provides the ability to manually flush the batch. + *

+ */ + public void flush() { + db().flush(); + } + /** * Update this entity. * diff --git a/src/main/java/io/ebean/Transaction.java b/src/main/java/io/ebean/Transaction.java index b36e6491c..6b645f9b6 100644 --- a/src/main/java/io/ebean/Transaction.java +++ b/src/main/java/io/ebean/Transaction.java @@ -429,6 +429,14 @@ public interface Transaction extends AutoCloseable { *
  • Transaction commit occurs
  • * */ + void flush() throws PersistenceException; + + /** + * This is a synonym for flush() and will be deprecated. + *

    + * flush() is preferred as it matches the JPA flush() method. + *

    + */ void flushBatch() throws PersistenceException; /** diff --git a/src/main/java/io/ebeaninternal/api/ScopedTransaction.java b/src/main/java/io/ebeaninternal/api/ScopedTransaction.java index 57ec62df0..145491135 100644 --- a/src/main/java/io/ebeaninternal/api/ScopedTransaction.java +++ b/src/main/java/io/ebeaninternal/api/ScopedTransaction.java @@ -295,9 +295,14 @@ public class ScopedTransaction implements SpiTransaction { return transaction.isBatchFlushOnQuery(); } + @Override + public void flush() throws PersistenceException { + transaction.flush(); + } + @Override public void flushBatch() throws PersistenceException { - transaction.flushBatch(); + flush(); } @Override diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index a3523f691..4b9eb23bf 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -840,6 +840,11 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return transactionScopeManager.get(); } + @Override + public void flush() { + currentTransaction().flush(); + } + /** * Commit the current transaction. */ diff --git a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java index a890a3104..9b9d31ce7 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java @@ -731,13 +731,18 @@ public class JdbcTransaction implements SpiTransaction { *

    */ @Override - public void flushBatch() { + public void flush() { if (!isActive()) { throw new IllegalStateException(illegalStateMessage); } internalBatchFlush(); } + @Override + public void flushBatch() { + flush(); + } + /** * Flush the JDBC batch and execute derived relationship statements if necessary. */ diff --git a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java index 8f0f0fc6f..6df8b1b6b 100644 --- a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java +++ b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java @@ -460,6 +460,11 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } + @Override + public void flush() { + + } + @Override public void commitTransaction() { diff --git a/src/test/java/org/tests/transaction/TestBatchModelFlush.java b/src/test/java/org/tests/transaction/TestBatchModelFlush.java new file mode 100644 index 000000000..752ad8096 --- /dev/null +++ b/src/test/java/org/tests/transaction/TestBatchModelFlush.java @@ -0,0 +1,27 @@ +package org.tests.transaction; + +import io.ebean.BaseTestCase; +import io.ebean.annotation.Transactional; +import org.junit.Test; +import org.tests.model.m2m.MnyB; + +public class TestBatchModelFlush extends BaseTestCase { + + @Transactional(batchSize = 50) + @Test + public void insert() { + + new MnyB("TestBatchModelFlush_0").save(); + new MnyB("TestBatchModelFlush_1").save(); + + MnyB bean = new MnyB("TestBatchModelFlush_2"); + bean.save(); + bean.db().currentTransaction().flush(); + + MnyB bean2 = new MnyB("TestBatchModelFlush_3"); + bean2.save(); + bean2.db().flush(); + + new MnyB("TestBatchModelFlush_4").save(); + } +}