From 8d976f83a97c93c45a1f603474e230e57d905494 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Mon, 18 Jun 2018 21:15:10 +1200 Subject: [PATCH] #1417 - Breaking API - Remove PersistBatch.INSERT ... migrate to PersistBatch.ALL --- pom.xml | 2 +- src/main/java/io/ebean/Transaction.java | 38 ++++++++- .../io/ebeaninternal/api/SpiTransaction.java | 2 +- .../api/SpiTransactionProxy.java | 19 ++++- .../server/core/PersistRequest.java | 2 +- .../ImplicitReadOnlyTransaction.java | 16 +++- .../server/transaction/JdbcTransaction.java | 80 +++++++++---------- .../server/transaction/NoTransaction.java | 16 +++- .../transaction/TransactionManager.java | 14 ++-- src/test/java/io/ebean/TxScopeTest.java | 2 +- .../io/ebean/config/ServerConfigTest.java | 8 +- .../batchinsert/TestBatchInsertSimple.java | 4 +- .../org/tests/model/basic/xtra/DummyDao.java | 6 +- .../transaction/TestBatchPersistCascade.java | 4 +- 14 files changed, 140 insertions(+), 73 deletions(-) diff --git a/pom.xml b/pom.xml index 6791ed678..ff6b3b7a4 100644 --- a/pom.xml +++ b/pom.xml @@ -117,7 +117,7 @@ io.ebean ebean-annotation - 3.12 + 4.1 diff --git a/src/main/java/io/ebean/Transaction.java b/src/main/java/io/ebean/Transaction.java index cd4a4bbc5..df79941e7 100644 --- a/src/main/java/io/ebean/Transaction.java +++ b/src/main/java/io/ebean/Transaction.java @@ -359,7 +359,10 @@ public interface Transaction extends AutoCloseable { void setBatchMode(boolean useBatch); /** - * The JDBC batch mode to use for this transaction. + * Deprecated - migrate to {@link #setBatchMode(boolean)}. + *

+ * Set the JDBC batch mode to use for this transaction. + *

*

* If this is NONE then JDBC batch can still be used for each request - save(), insert(), update() or delete() * and this would be useful if the request cascades to detail beans. @@ -368,15 +371,23 @@ public interface Transaction extends AutoCloseable { * @param persistBatchMode the batch mode to use for this transaction * @see io.ebean.config.ServerConfig#setPersistBatch(PersistBatch) */ + @Deprecated void setBatch(PersistBatch persistBatchMode); + /** + * Deprecated - migrate to {@link #isBatchMode()}. + * Return the batch mode at the transaction level. + */ + @Deprecated + PersistBatch getBatch(); + /** * Return the batch mode at the transaction level. */ - PersistBatch getBatch(); + boolean isBatchMode(); /** - * Set the JDBC batch mode to use for a save() or delete() request. + * Set the JDBC batch mode to use for a save() or delete() when cascading to children. *

* This only takes effect when batch mode on the transaction has not already meant that * JDBC batch mode is being used. @@ -385,17 +396,36 @@ public interface Transaction extends AutoCloseable { * This is useful when the single save() or delete() cascades. For example, inserting a 'master' cascades * and inserts a collection of 'detail' beans. The detail beans can be inserted using JDBC batch. *

+ *

+ * This is effectively already turned on for all platforms apart from older Sql Server. + *

* - * @param batchOnCascadeMode the batch mode to use per save(), insert(), update() or delete() + * @param batchMode the batch mode to use per save(), insert(), update() or delete() * @see io.ebean.config.ServerConfig#setPersistBatchOnCascade(PersistBatch) */ + void setBatchOnCascade(boolean batchMode); + + /** + * Set the batch mode when cascading. + *

+ * Deprecated in favour of {@link #setBatchOnCascade(boolean)} + *

+ */ + @Deprecated void setBatchOnCascade(PersistBatch batchOnCascadeMode); /** + * Deprecated - migrate to {@link #isBatchMode()}. * Return the batch mode at the request level (for each save(), insert(), update() or delete()). */ + @Deprecated PersistBatch getBatchOnCascade(); + /** + * Return the batch mode at the request level. + */ + boolean isBatchOnCascade(); + /** * Specify the number of statements before a batch is flushed automatically. */ diff --git a/src/main/java/io/ebeaninternal/api/SpiTransaction.java b/src/main/java/io/ebeaninternal/api/SpiTransaction.java index 0054757da..e362e1e9e 100644 --- a/src/main/java/io/ebeaninternal/api/SpiTransaction.java +++ b/src/main/java/io/ebeaninternal/api/SpiTransaction.java @@ -184,7 +184,7 @@ public interface SpiTransaction extends Transaction { * Return true if this request should be batched. Conversely returns false * if this request should be executed immediately. */ - boolean isBatchThisRequest(PersistRequest.Type type); + boolean isBatchThisRequest(); /** * Return the BatchControl used to batch up persist requests. diff --git a/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java b/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java index ffbb3c727..c84f7bc2e 100644 --- a/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java +++ b/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java @@ -250,6 +250,11 @@ public abstract class SpiTransactionProxy implements SpiTransaction { transaction.setBatchMode(useBatch); } + @Override + public boolean isBatchMode() { + return transaction.isBatchMode(); + } + @Override public void setBatch(PersistBatch persistBatchMode) { transaction.setBatch(persistBatchMode); @@ -260,11 +265,21 @@ public abstract class SpiTransactionProxy implements SpiTransaction { return transaction.getBatch(); } + @Override + public void setBatchOnCascade(boolean batchMode) { + transaction.setBatchOnCascade(batchMode); + } + @Override public void setBatchOnCascade(PersistBatch batchOnCascadeMode) { transaction.setBatchOnCascade(batchOnCascadeMode); } + @Override + public boolean isBatchOnCascade() { + return transaction.isBatchOnCascade(); + } + @Override public PersistBatch getBatchOnCascade() { return transaction.getBatchOnCascade(); @@ -361,8 +376,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction { } @Override - public boolean isBatchThisRequest(PersistRequest.Type type) { - return transaction.isBatchThisRequest(type); + public boolean isBatchThisRequest() { + return transaction.isBatchThisRequest(); } @Override diff --git a/src/main/java/io/ebeaninternal/server/core/PersistRequest.java b/src/main/java/io/ebeaninternal/server/core/PersistRequest.java index a031ae2fb..102bfa07d 100644 --- a/src/main/java/io/ebeaninternal/server/core/PersistRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/PersistRequest.java @@ -92,7 +92,7 @@ public abstract class PersistRequest extends BeanRequest implements BatchPostExe * Return true if this persist request should use JDBC batch. */ public boolean isBatchThisRequest() { - return transaction.isBatchThisRequest(type); + return transaction.isBatchThisRequest(); } /** diff --git a/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java index 44e5b4bd1..8bca03fc9 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java @@ -297,11 +297,25 @@ class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCode } + @Override + public boolean isBatchMode() { + return false; + } + + @Override + public boolean isBatchOnCascade() { + return false; + } + @Override public PersistBatch getBatch() { return null; } + @Override + public void setBatchOnCascade(boolean batchMode) { + } + @Override public void setBatchOnCascade(PersistBatch batchOnCascadeMode) { } @@ -353,7 +367,7 @@ class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCode * this request should be executed immediately. */ @Override - public boolean isBatchThisRequest(PersistRequest.Type type) { + public boolean isBatchThisRequest() { return false; } diff --git a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java index 2fbaab79a..7fe53c827 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java @@ -118,11 +118,11 @@ public class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { protected Boolean updateAllLoadedProperties; - protected PersistBatch oldBatchMode; + protected boolean oldBatchMode; - protected PersistBatch batchMode; + protected boolean batchMode; - protected PersistBatch batchOnCascadeMode; + protected boolean batchOnCascadeMode; protected int batchSize = -1; @@ -208,8 +208,8 @@ public class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { this.logSql = false; this.logSummary = false; this.skipCacheAfterWrite = true; - this.batchMode = PersistBatch.NONE; - this.batchOnCascadeMode = PersistBatch.NONE; + this.batchMode = false; + this.batchOnCascadeMode = false; this.onQueryOnly = OnQueryOnly.ROLLBACK; } else { this.startMillis = manager.clockNowMillis(); @@ -570,14 +570,6 @@ public class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { @Override public void setBatchMode(boolean batchMode) { - if (!isActive()) { - throw new IllegalStateException(illegalStateMessage); - } - this.batchMode = (batchMode) ? PersistBatch.ALL : PersistBatch.NONE; - } - - @Override - public void setBatch(PersistBatch batchMode) { if (!isActive()) { throw new IllegalStateException(illegalStateMessage); } @@ -585,20 +577,40 @@ public class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { } @Override - public PersistBatch getBatch() { + public void setBatch(PersistBatch batchMode) { + setBatchMode(PersistBatch.ALL == batchMode); + } + + @Override + public boolean isBatchMode() { return batchMode; } @Override - public void setBatchOnCascade(PersistBatch batchOnCascadeMode) { + public PersistBatch getBatch() { + return batchMode ? PersistBatch.ALL : PersistBatch.NONE; + } + + @Override + public void setBatchOnCascade(boolean batchMode) { if (!isActive()) { throw new IllegalStateException(illegalStateMessage); } - this.batchOnCascadeMode = batchOnCascadeMode; + this.batchOnCascadeMode = batchMode; + } + + @Override + public void setBatchOnCascade(PersistBatch batchMode) { + setBatchOnCascade(PersistBatch.ALL == batchMode); } @Override public PersistBatch getBatchOnCascade() { + return batchOnCascadeMode ? PersistBatch.ALL : PersistBatch.NONE; + } + + @Override + public boolean isBatchOnCascade() { return batchOnCascadeMode; } @@ -657,36 +669,18 @@ public class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { * this request should be executed immediately. */ @Override - public boolean isBatchThisRequest(PersistRequest.Type type) { + public boolean isBatchThisRequest() { if (!batchOnCascadeSet && !explicit && depth <= 0) { // implicit transaction, no gain by batching where depth <= 0 return false; } - return isBatch(batchMode, type); - } - - /** - * Return true if JDBC batch should be used on cascade persist. - */ - private boolean isBatchOnCascade(PersistRequest.Type type) { - return isBatch(batchOnCascadeMode, type); - } - - private boolean isBatch(PersistBatch batch, PersistRequest.Type type) { - switch (batch) { - case ALL: - return true; - case INSERT: - return type == PersistRequest.Type.INSERT; - default: - return false; - } + return batchMode; } @Override public void checkBatchEscalationOnCollection() { - if (batchMode == PersistBatch.NONE && batchOnCascadeMode != PersistBatch.NONE) { - batchMode = batchOnCascadeMode; + if (!batchMode && batchOnCascadeMode) { + batchMode = true; batchOnCascadeSet = true; } } @@ -696,7 +690,7 @@ public class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { if (batchOnCascadeSet) { batchFlushReset(); // restore the previous batch mode of NONE - batchMode = PersistBatch.NONE; + batchMode = false; } } @@ -753,15 +747,15 @@ public class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { @Override public boolean checkBatchEscalationOnCascade(PersistRequestBean request) { - if (isBatch(batchMode, request.getType())) { + if (batchMode) { // already batching (at top level) return false; } - if (isBatchOnCascade(request.getType())) { + if (batchOnCascadeMode) { // escalate up to batch mode for this request (and cascade) - oldBatchMode = batchMode; - batchMode = PersistBatch.ALL; + oldBatchMode = false; + batchMode = true; batchFlushReset(); // skip using jdbc batch for the top level bean (no gain there) request.setSkipBatchForTopLevel(); diff --git a/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java index bd2b20c35..31bf1ca30 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java @@ -236,6 +236,15 @@ class NoTransaction implements SpiTransaction { return null; } + @Override + public boolean isBatchMode() { + return false; + } + + @Override + public void setBatchOnCascade(boolean batchMode) { + } + @Override public void setBatchOnCascade(PersistBatch batchOnCascadeMode) { @@ -246,6 +255,11 @@ class NoTransaction implements SpiTransaction { return null; } + @Override + public boolean isBatchOnCascade() { + return false; + } + @Override public void setBatchSize(int batchSize) { @@ -337,7 +351,7 @@ class NoTransaction implements SpiTransaction { } @Override - public boolean isBatchThisRequest(PersistRequest.Type type) { + public boolean isBatchThisRequest() { return false; } diff --git a/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java b/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java index 4a007a9b3..09f24c867 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java +++ b/src/main/java/io/ebeaninternal/server/transaction/TransactionManager.java @@ -97,9 +97,9 @@ public class TransactionManager implements SpiTransactionManager { */ protected final DocStoreUpdateProcessor docStoreUpdateProcessor; - protected final PersistBatch persistBatch; + protected final boolean persistBatch; - protected final PersistBatch persistBatchOnCascade; + protected final boolean persistBatchOnCascade; protected final BulkEventListenerMap bulkEventListenerMap; @@ -153,8 +153,8 @@ public class TransactionManager implements SpiTransactionManager { this.databasePlatform = options.config.getDatabasePlatform(); this.skipCacheAfterWrite = options.config.isSkipCacheAfterWrite(); this.notifyL2CacheInForeground = options.notifyL2CacheInForeground; - this.persistBatch = options.config.getPersistBatch(); - this.persistBatchOnCascade = options.config.appliedPersistBatchOnCascade(); + this.persistBatch = PersistBatch.ALL == options.config.getPersistBatch(); + this.persistBatchOnCascade = PersistBatch.ALL == options.config.appliedPersistBatchOnCascade(); this.rollbackOnChecked = options.config.isTransactionRollbackOnChecked(); this.beanDescriptorManager = options.descMgr; this.viewInvalidation = options.descMgr.requiresViewEntityCacheInvalidation(); @@ -271,11 +271,11 @@ public class TransactionManager implements SpiTransactionManager { return bulkEventListenerMap; } - public PersistBatch getPersistBatch() { + public boolean getPersistBatch() { return persistBatch; } - public PersistBatch getPersistBatchOnCascade() { + public boolean getPersistBatchOnCascade() { return persistBatchOnCascade; } @@ -340,7 +340,7 @@ public class TransactionManager implements SpiTransactionManager { ExternalJdbcTransaction t = new ExternalJdbcTransaction(id, true, c, this); // set the default batch mode - t.setBatch(persistBatch); + t.setBatchMode(persistBatch); t.setBatchOnCascade(persistBatchOnCascade); return t; } diff --git a/src/test/java/io/ebean/TxScopeTest.java b/src/test/java/io/ebean/TxScopeTest.java index fefbd1434..55524e4f0 100644 --- a/src/test/java/io/ebean/TxScopeTest.java +++ b/src/test/java/io/ebean/TxScopeTest.java @@ -59,7 +59,7 @@ public class TxScopeTest { TxScope scope = new TxScope(); scope.setBatchSize(100); - scope.setBatchOnCascade(PersistBatch.INSERT); + scope.setBatchOnCascade(PersistBatch.ALL); scope.checkBatchMode(); assertNull(scope.getBatch()); diff --git a/src/test/java/io/ebean/config/ServerConfigTest.java b/src/test/java/io/ebean/config/ServerConfigTest.java index fc24bc40c..b0ff31457 100644 --- a/src/test/java/io/ebean/config/ServerConfigTest.java +++ b/src/test/java/io/ebean/config/ServerConfigTest.java @@ -51,8 +51,8 @@ public class ServerConfigTest { serverConfig.setReadOnlyDataSourceConfig(new DataSourceConfig()); Properties props = new Properties(); - props.setProperty("persistBatch", "INSERT"); - props.setProperty("persistBatchOnCascade", "INSERT"); + props.setProperty("persistBatch", "ALL"); + props.setProperty("persistBatchOnCascade", "ALL"); props.setProperty("dbuuid", "binary"); props.setProperty("jdbcFetchSizeFindEach", "42"); props.setProperty("jdbcFetchSizeFindList", "43"); @@ -80,8 +80,8 @@ public class ServerConfigTest { assertThat(serverConfig.getNamingConvention()).isInstanceOf(MatchingNamingConvention.class); assertEquals(IdType.SEQUENCE, serverConfig.getIdType()); - assertEquals(PersistBatch.INSERT, serverConfig.getPersistBatch()); - assertEquals(PersistBatch.INSERT, serverConfig.getPersistBatchOnCascade()); + assertEquals(PersistBatch.ALL, serverConfig.getPersistBatch()); + assertEquals(PersistBatch.ALL, serverConfig.getPersistBatchOnCascade()); assertEquals(PlatformConfig.DbUuid.BINARY, serverConfig.getPlatformConfig().getDbUuid()); assertEquals(JsonConfig.DateTime.ISO8601, serverConfig.getJsonDateTime()); diff --git a/src/test/java/org/tests/batchinsert/TestBatchInsertSimple.java b/src/test/java/org/tests/batchinsert/TestBatchInsertSimple.java index 0b90b4ffa..8245f31ea 100644 --- a/src/test/java/org/tests/batchinsert/TestBatchInsertSimple.java +++ b/src/test/java/org/tests/batchinsert/TestBatchInsertSimple.java @@ -28,7 +28,7 @@ public class TestBatchInsertSimple extends BaseTestCase { Transaction transaction = Ebean.beginTransaction(); try { transaction.setBatch(PersistBatch.NONE); - transaction.setBatchOnCascade(PersistBatch.INSERT); + transaction.setBatchOnCascade(PersistBatch.ALL); transaction.setBatchSize(30); // setBatchGetGeneratedKeys MUST be turned off for MS SQL Server because :( transaction.setBatchGetGeneratedKeys(false); @@ -101,7 +101,7 @@ public class TestBatchInsertSimple extends BaseTestCase { Transaction transaction = Ebean.beginTransaction(); try { transaction.setBatch(PersistBatch.NONE); - transaction.setBatchOnCascade(PersistBatch.INSERT); + transaction.setBatchOnCascade(PersistBatch.ALL); transaction.setBatchSize(30); // setBatchGetGeneratedKeys MUST be turned off for MS SQL Server because :( transaction.setBatchGetGeneratedKeys(false); diff --git a/src/test/java/org/tests/model/basic/xtra/DummyDao.java b/src/test/java/org/tests/model/basic/xtra/DummyDao.java index b49996c5a..470af46e0 100644 --- a/src/test/java/org/tests/model/basic/xtra/DummyDao.java +++ b/src/test/java/org/tests/model/basic/xtra/DummyDao.java @@ -46,19 +46,19 @@ public class DummyDao { } - @Transactional(batch = PersistBatch.INSERT, batchOnCascade = PersistBatch.NONE, batchSize = 77) + @Transactional(batch = PersistBatch.ALL, batchOnCascade = PersistBatch.NONE, batchSize = 77) public void doOuterWithBatchOptionsSet() { Transaction txn = Ebean.currentTransaction(); - assertEquals(PersistBatch.INSERT, txn.getBatch()); + assertEquals(PersistBatch.ALL, txn.getBatch()); assertEquals(PersistBatch.NONE, txn.getBatchOnCascade()); assertEquals(77, txn.getBatchSize()); doWithBatchOptionsSet(); // batch options set back - assertEquals(PersistBatch.INSERT, txn.getBatch()); + assertEquals(PersistBatch.ALL, txn.getBatch()); assertEquals(PersistBatch.NONE, txn.getBatchOnCascade()); assertEquals(77, txn.getBatchSize()); diff --git a/src/test/java/org/tests/transaction/TestBatchPersistCascade.java b/src/test/java/org/tests/transaction/TestBatchPersistCascade.java index 62dabc031..5c35a381d 100644 --- a/src/test/java/org/tests/transaction/TestBatchPersistCascade.java +++ b/src/test/java/org/tests/transaction/TestBatchPersistCascade.java @@ -29,7 +29,7 @@ public class TestBatchPersistCascade extends BaseTestCase { Transaction txn = ebeanServer.beginTransaction(); try { - txn.setBatch(PersistBatch.INSERT); + txn.setBatch(PersistBatch.ALL); logger.info("start ------------"); for (int i = 0; i < 3; i++) { @@ -62,7 +62,7 @@ public class TestBatchPersistCascade extends BaseTestCase { Transaction txn = server.beginTransaction(); try { - txn.setBatch(PersistBatch.INSERT); + txn.setBatch(PersistBatch.ALL); txn.setBatchOnCascade(PersistBatch.ALL); for (int i = 0; i < 3; i++) {