From e3425a885082200d43cff2e08ef7cc1bafe9cb82 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Sun, 25 Feb 2018 20:40:53 +0100 Subject: [PATCH] FIX: possible resource leaking in testcases (all created transactions are closed by followed try statement) (#1273) --- .../io/ebean/EbeanServer_saveAllTest.java | 2 +- .../org/tests/basic/TestQueryForUpdate.java | 1 - .../batchinsert/TestBatchInsertFlush.java | 11 +- .../batchinsert/TestBatchInsertSimple.java | 9 +- .../TestBatchOnCascadeExceptionHandling.java | 6 +- .../cache/TestL2DirtyFlagOnLazyLoad.java | 63 +++++----- .../org/tests/compositekeys/TestCore.java | 118 +++++++++--------- .../TestDeleteByIdWithPersistenceContext.java | 23 ++-- .../org/tests/idkeys/TestGeneratedKeys.java | 38 +++--- .../query/TestConnectionCloseOnSqlerr.java | 2 +- .../org/tests/query/TestManyWhereJoinM2M.java | 49 ++++---- .../tests/rawsql/TestRawSqlNamedParams.java | 1 - .../tests/rawsql/TestRawSqlWithResultSet.java | 4 +- .../org/tests/timezone/TimezoneTests.java | 49 ++++---- .../transaction/TestAutoCommitDataSource.java | 34 ++--- .../tests/transaction/TestBeanStateReset.java | 1 - .../TestBeginTransactionWithExisting.java | 5 +- .../TestExplicitTransactionMode.java | 37 +++--- .../transaction/TestPersistContextClear.java | 16 +-- .../tests/transaction/TestSqlServerBatch.java | 3 +- .../TestStatelessUpdateClearPC.java | 33 ++--- .../transaction/TestTransactionCallback.java | 16 ++- .../org/tests/update/TestSqlUpdateInTxn.java | 22 ++-- 23 files changed, 278 insertions(+), 265 deletions(-) diff --git a/src/test/java/io/ebean/EbeanServer_saveAllTest.java b/src/test/java/io/ebean/EbeanServer_saveAllTest.java index 743fa59c6..69bc95753 100644 --- a/src/test/java/io/ebean/EbeanServer_saveAllTest.java +++ b/src/test/java/io/ebean/EbeanServer_saveAllTest.java @@ -60,8 +60,8 @@ public class EbeanServer_saveAllTest extends BaseTestCase { EbeanServer server = Ebean.getDefaultServer(); Transaction transaction = server.beginTransaction(); - transaction.setBatch(PersistBatch.ALL); try { + transaction.setBatch(PersistBatch.ALL); LoggedSqlCollector.start(); for (EBasicVer bean : beans(2)) { diff --git a/src/test/java/org/tests/basic/TestQueryForUpdate.java b/src/test/java/org/tests/basic/TestQueryForUpdate.java index 4a2c63c31..c78aaebaa 100644 --- a/src/test/java/org/tests/basic/TestQueryForUpdate.java +++ b/src/test/java/org/tests/basic/TestQueryForUpdate.java @@ -49,7 +49,6 @@ public class TestQueryForUpdate extends BaseTestCase { ResetBasicData.reset(); Ebean.beginTransaction(); - try { Query query = Ebean.find(Customer.class) .forUpdateNoWait() diff --git a/src/test/java/org/tests/batchinsert/TestBatchInsertFlush.java b/src/test/java/org/tests/batchinsert/TestBatchInsertFlush.java index d5b5add3f..7b5d61ce4 100644 --- a/src/test/java/org/tests/batchinsert/TestBatchInsertFlush.java +++ b/src/test/java/org/tests/batchinsert/TestBatchInsertFlush.java @@ -32,13 +32,12 @@ public class TestBatchInsertFlush extends BaseTestCase { MetaInfoManager metaInfoManager = server.getMetaInfoManager(); metaInfoManager.collectTransactionStatistics(true); - Transaction transaction = server.beginTransaction() - .setPersistCascade(false) - .setBatchSize(10) - .setBatch(PersistBatch.ALL) - .setLabel("TestBatchInsertFlush.no_cascade"); - + Transaction transaction = server.beginTransaction(); try { + transaction.setPersistCascade(false) + .setBatchSize(10) + .setBatch(PersistBatch.ALL) + .setLabel("TestBatchInsertFlush.no_cascade"); LoggedSqlCollector.start(); diff --git a/src/test/java/org/tests/batchinsert/TestBatchInsertSimple.java b/src/test/java/org/tests/batchinsert/TestBatchInsertSimple.java index b49aebc75..e73842925 100644 --- a/src/test/java/org/tests/batchinsert/TestBatchInsertSimple.java +++ b/src/test/java/org/tests/batchinsert/TestBatchInsertSimple.java @@ -128,12 +128,11 @@ public class TestBatchInsertSimple extends BaseTestCase { masters.add(createMasterAndDetails(i, 7)); } - Transaction transaction = Ebean.beginTransaction() - .setBatch(PersistBatch.NONE) - .setBatchOnCascade(PersistBatch.ALL) - .setBatchSize(20); - + Transaction transaction = Ebean.beginTransaction(); try { + transaction.setBatch(PersistBatch.NONE) + .setBatchOnCascade(PersistBatch.ALL) + .setBatchSize(20); // escalate based on batchOnCascade value Ebean.saveAll(masters); diff --git a/src/test/java/org/tests/batchinsert/TestBatchOnCascadeExceptionHandling.java b/src/test/java/org/tests/batchinsert/TestBatchOnCascadeExceptionHandling.java index a9dc9facb..568dd0e8b 100644 --- a/src/test/java/org/tests/batchinsert/TestBatchOnCascadeExceptionHandling.java +++ b/src/test/java/org/tests/batchinsert/TestBatchOnCascadeExceptionHandling.java @@ -82,10 +82,10 @@ public class TestBatchOnCascadeExceptionHandling extends BaseTestCase { protected void testBatchOnCascadeIsExceptionSafe(EbeanServer server, Runnable failingOperation) { Transaction txn = server.beginTransaction(); - assertThat(txn.getBatch()).isSameAs(PersistBatch.NONE); - assertThat(txn.getBatchOnCascade()).isSameAs(PersistBatch.ALL); - try { + assertThat(txn.getBatch()).isSameAs(PersistBatch.NONE); + assertThat(txn.getBatchOnCascade()).isSameAs(PersistBatch.ALL); + failingOperation.run(); Assertions.fail("PersistenceException expected"); } catch (PersistenceException e) { diff --git a/src/test/java/org/tests/cache/TestL2DirtyFlagOnLazyLoad.java b/src/test/java/org/tests/cache/TestL2DirtyFlagOnLazyLoad.java index 1720d33c6..bd655c2fd 100644 --- a/src/test/java/org/tests/cache/TestL2DirtyFlagOnLazyLoad.java +++ b/src/test/java/org/tests/cache/TestL2DirtyFlagOnLazyLoad.java @@ -16,50 +16,51 @@ public class TestL2DirtyFlagOnLazyLoad extends BaseTestCase { @Test public void dirtyFlag_reset_after_lazy() { - - //PREPARE - Transaction tx0 = Ebean.beginTransaction(); L2CachedLazyDirtFlagResetBean bean = new L2CachedLazyDirtFlagResetBean(); - bean.setName("findById"); - Ebean.save(bean); - //bean.save(); - tx0.commit(); + //PREPARE + try (Transaction tx0 = Ebean.beginTransaction()) { + bean.setName("findById"); + Ebean.save(bean); + //bean.save(); + tx0.commit(); + } // clearAll() caches via the ServerCacheManager ... // Clear all the caches on the default/primary EbeanServer server().getServerCacheManager().clearAll(); //TEST - Transaction tx1 = Ebean.beginTransaction(); - // load (and dont touch any related entity) - L2CachedLazyDirtFlagResetBean bean1 = Ebean.find(L2CachedLazyDirtFlagResetBean.class, bean.getId()); - assertThat(bean1).isNotNull(); - tx1.commit(); + try (Transaction tx1 = Ebean.beginTransaction()) { + // load (and dont touch any related entity) + L2CachedLazyDirtFlagResetBean bean1 = Ebean.find(L2CachedLazyDirtFlagResetBean.class, bean.getId()); + assertThat(bean1).isNotNull(); + tx1.commit(); + } + try (Transaction tx2 = Ebean.beginTransaction()) { + // load (and modify) - Transaction tx2 = Ebean.beginTransaction(); - // load (and modify) + L2CachedLazyDirtFlagResetBean bean2 = Ebean.find(L2CachedLazyDirtFlagResetBean.class, bean.getId()); + assertNotNull(bean2); + assertEquals("findById", bean2.getName()); + bean2.setName("something"); + BeanState beanState = Ebean.getBeanState(bean2); + assertTrue(beanState.isDirty()); + //bean2.getChildren().size(); + bean2.someRichObjectMethod(); + assertTrue(beanState.isDirty()); - L2CachedLazyDirtFlagResetBean bean2 = Ebean.find(L2CachedLazyDirtFlagResetBean.class, bean.getId()); - assertNotNull(bean2); - assertEquals("findById", bean2.getName()); - bean2.setName("something"); - BeanState beanState = Ebean.getBeanState(bean2); - assertTrue(beanState.isDirty()); - //bean2.getChildren().size(); - bean2.someRichObjectMethod(); - assertTrue(beanState.isDirty()); + Ebean.update(bean2); + tx2.commit(); + } - Ebean.update(bean2); - tx2.commit(); + try(Transaction tx3 = Ebean.beginTransaction()) { + // validation - Transaction tx3 = Ebean.beginTransaction(); - // validation + L2CachedLazyDirtFlagResetBean bean3 = Ebean.find(L2CachedLazyDirtFlagResetBean.class, bean.getId()); + assertEquals("something", bean3.getName()); - L2CachedLazyDirtFlagResetBean bean3 = Ebean.find(L2CachedLazyDirtFlagResetBean.class, bean.getId()); - assertEquals("something", bean3.getName()); - - tx3.rollback(); + } } } diff --git a/src/test/java/org/tests/compositekeys/TestCore.java b/src/test/java/org/tests/compositekeys/TestCore.java index 8eaf3e27b..0a1f96500 100644 --- a/src/test/java/org/tests/compositekeys/TestCore.java +++ b/src/test/java/org/tests/compositekeys/TestCore.java @@ -37,72 +37,72 @@ public class TestCore extends BaseTestCase { Ebean.createUpdate(Type.class, "delete from Type").execute(); Ebean.createUpdate(SubType.class, "delete from SubType").execute(); - Transaction tx = server().beginTransaction(); + try (Transaction tx = server().beginTransaction()) { + SubType subType = new SubType(); + SubTypeKey subTypeKey = new SubTypeKey(); + subTypeKey.setSubTypeId(1); + subType.setKey(subTypeKey); + subType.setDescription("ANY SUBTYPE"); + server().save(subType); - SubType subType = new SubType(); - SubTypeKey subTypeKey = new SubTypeKey(); - subTypeKey.setSubTypeId(1); - subType.setKey(subTypeKey); - subType.setDescription("ANY SUBTYPE"); - server().save(subType); + Type type = new Type(); + TypeKey typeKey = new TypeKey(); + typeKey.setCustomer(1); + typeKey.setType(10); + type.setKey(typeKey); + type.setDescription("Type Old-Item - Customer 1"); + type.setSubType(subType); + server().save(type); - Type type = new Type(); - TypeKey typeKey = new TypeKey(); - typeKey.setCustomer(1); - typeKey.setType(10); - type.setKey(typeKey); - type.setDescription("Type Old-Item - Customer 1"); - type.setSubType(subType); - server().save(type); + type = new Type(); + typeKey = new TypeKey(); + typeKey.setCustomer(2); + typeKey.setType(10); + type.setKey(typeKey); + type.setDescription("Type Old-Item - Customer 2"); + type.setSubType(subType); + server().save(type); - type = new Type(); - typeKey = new TypeKey(); - typeKey.setCustomer(2); - typeKey.setType(10); - type.setKey(typeKey); - type.setDescription("Type Old-Item - Customer 2"); - type.setSubType(subType); - server().save(type); + Region region = new Region(); + RegionKey regionKey = new RegionKey(); + regionKey.setCustomer(1); + regionKey.setType(500); + region.setKey(regionKey); + region.setDescription("Region West - Customer 1"); + server().save(region); - Region region = new Region(); - RegionKey regionKey = new RegionKey(); - regionKey.setCustomer(1); - regionKey.setType(500); - region.setKey(regionKey); - region.setDescription("Region West - Customer 1"); - server().save(region); + region = new Region(); + regionKey = new RegionKey(); + regionKey.setCustomer(2); + regionKey.setType(500); + region.setKey(regionKey); + region.setDescription("Region West - Customer 2"); + server().save(region); - region = new Region(); - regionKey = new RegionKey(); - regionKey.setCustomer(2); - regionKey.setType(500); - region.setKey(regionKey); - region.setDescription("Region West - Customer 2"); - server().save(region); + Item item = new Item(); + ItemKey itemKey = new ItemKey(); + itemKey.setCustomer(1); + itemKey.setItemNumber("ITEM1"); + item.setKey(itemKey); + item.setUnits("P"); + item.setDescription("Fancy Car - Customer 1"); + item.setRegion(500); + item.setType(10); + server().save(item); - Item item = new Item(); - ItemKey itemKey = new ItemKey(); - itemKey.setCustomer(1); - itemKey.setItemNumber("ITEM1"); - item.setKey(itemKey); - item.setUnits("P"); - item.setDescription("Fancy Car - Customer 1"); - item.setRegion(500); - item.setType(10); - server().save(item); + item = new Item(); + itemKey = new ItemKey(); + itemKey.setCustomer(2); + itemKey.setItemNumber("ITEM1"); + item.setKey(itemKey); + item.setUnits("P"); + item.setDescription("Another Fancy Car - Customer 2"); + item.setRegion(500); + item.setType(10); + server().save(item); - item = new Item(); - itemKey = new ItemKey(); - itemKey.setCustomer(2); - itemKey.setItemNumber("ITEM1"); - item.setKey(itemKey); - item.setUnits("P"); - item.setDescription("Another Fancy Car - Customer 2"); - item.setRegion(500); - item.setType(10); - server().save(item); - - tx.commit(); + tx.commit(); + } } @Test diff --git a/src/test/java/org/tests/delete/TestDeleteByIdWithPersistenceContext.java b/src/test/java/org/tests/delete/TestDeleteByIdWithPersistenceContext.java index 066fc237b..9e7f2a348 100644 --- a/src/test/java/org/tests/delete/TestDeleteByIdWithPersistenceContext.java +++ b/src/test/java/org/tests/delete/TestDeleteByIdWithPersistenceContext.java @@ -3,6 +3,7 @@ package org.tests.delete; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.EbeanServer; +import io.ebean.Transaction; import org.tests.model.basic.Product; import org.tests.model.basic.ResetBasicData; import org.junit.Assert; @@ -26,21 +27,21 @@ public class TestDeleteByIdWithPersistenceContext extends BaseTestCase { Product prod2 = createProduct(101, "bananas"); server.insert(prod2); - server.beginTransaction(); - // effectively load these into the persistence context - server.find(Product.class, prod1.getId()); - server.find(Product.class, prod2.getId()); + try (Transaction txn = server.beginTransaction()) { + // effectively load these into the persistence context + server.find(Product.class, prod1.getId()); + server.find(Product.class, prod2.getId()); - server.deleteAll(Product.class, Arrays.asList(prod1.getId(), prod2.getId())); + server.deleteAll(Product.class, Arrays.asList(prod1.getId(), prod2.getId())); - // are these found in the persistence context? - Product shadow1 = server.find(Product.class, prod1.getId()); - Product shadow2 = server.find(Product.class, prod2.getId()); + // are these found in the persistence context? + Product shadow1 = server.find(Product.class, prod1.getId()); + Product shadow2 = server.find(Product.class, prod2.getId()); - Assert.assertNull(shadow1); - Assert.assertNull(shadow2); + Assert.assertNull(shadow1); + Assert.assertNull(shadow2); - server.endTransaction(); + } } diff --git a/src/test/java/org/tests/idkeys/TestGeneratedKeys.java b/src/test/java/org/tests/idkeys/TestGeneratedKeys.java index d1b82d9ad..9e35598cd 100644 --- a/src/test/java/org/tests/idkeys/TestGeneratedKeys.java +++ b/src/test/java/org/tests/idkeys/TestGeneratedKeys.java @@ -30,20 +30,21 @@ public class TestGeneratedKeys extends BaseTestCase { return; } - Transaction tx = server.beginTransaction(); + try (Transaction tx = server.beginTransaction()) { - long sequenceStart = readSequenceValue(tx, GenKeySequence.SEQUENCE_NAME); + long sequenceStart = readSequenceValue(tx, GenKeySequence.SEQUENCE_NAME); - GenKeySequence al = new GenKeySequence(); - al.setDescription("my description"); - server.save(al); + GenKeySequence al = new GenKeySequence(); + al.setDescription("my description"); + server.save(al); - long sequenceCurrent = readSequenceValue(tx, GenKeySequence.SEQUENCE_NAME); + long sequenceCurrent = readSequenceValue(tx, GenKeySequence.SEQUENCE_NAME); - assertNotNull(al.getId()); - assertFalse(sequenceStart == sequenceCurrent); - assertEquals(sequenceStart + 20, sequenceCurrent); + assertNotNull(al.getId()); + assertFalse(sequenceStart == sequenceCurrent); + assertEquals(sequenceStart + 20, sequenceCurrent); + } } @@ -76,19 +77,20 @@ public class TestGeneratedKeys extends BaseTestCase { return; } - Transaction tx = server.beginTransaction(); + try (Transaction tx = server.beginTransaction()) { - GenKeyIdentity al = new GenKeyIdentity(); - al.setDescription("my description"); - server.save(al); + GenKeyIdentity al = new GenKeyIdentity(); + al.setDescription("my description"); + server.save(al); - // For JDBC batching we won't get the id until after - // the batch has been flushed explicitly or via commit - //assertNotNull(al.getId()); + // For JDBC batching we won't get the id until after + // the batch has been flushed explicitly or via commit + //assertNotNull(al.getId()); - tx.commit(); + tx.commit(); - assertNotNull(al.getId()); + assertNotNull(al.getId()); + } } } diff --git a/src/test/java/org/tests/query/TestConnectionCloseOnSqlerr.java b/src/test/java/org/tests/query/TestConnectionCloseOnSqlerr.java index 7c5a6bde0..baddc58dc 100644 --- a/src/test/java/org/tests/query/TestConnectionCloseOnSqlerr.java +++ b/src/test/java/org/tests/query/TestConnectionCloseOnSqlerr.java @@ -49,8 +49,8 @@ public class TestConnectionCloseOnSqlerr extends BaseTestCase { try { for (int i = 0; i < 100; i++) { + Ebean.beginTransaction(); try { - Ebean.beginTransaction(); Query q0 = Ebean.find(Customer.class).where().icontains("namexxx", "Rob") .query(); diff --git a/src/test/java/org/tests/query/TestManyWhereJoinM2M.java b/src/test/java/org/tests/query/TestManyWhereJoinM2M.java index c68aa823d..f936e2442 100644 --- a/src/test/java/org/tests/query/TestManyWhereJoinM2M.java +++ b/src/test/java/org/tests/query/TestManyWhereJoinM2M.java @@ -3,6 +3,7 @@ package org.tests.query; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Query; +import io.ebean.Transaction; import org.tests.model.basic.MRole; import org.tests.model.basic.MUser; import org.junit.Assert; @@ -17,39 +18,39 @@ public class TestManyWhereJoinM2M extends BaseTestCase { @Test public void test() { - Ebean.beginTransaction(); + try (Transaction txn = Ebean.beginTransaction()) { - MRole r1 = new MRole(); - r1.setRoleName("role1"); - Ebean.save(r1); + MRole r1 = new MRole(); + r1.setRoleName("role1"); + Ebean.save(r1); - MRole r2 = new MRole(); - r2.setRoleName("role2special"); - Ebean.save(r2); + MRole r2 = new MRole(); + r2.setRoleName("role2special"); + Ebean.save(r2); - MRole r3 = new MRole(); - r3.setRoleName("role3"); - Ebean.save(r3); + MRole r3 = new MRole(); + r3.setRoleName("role3"); + Ebean.save(r3); - MUser u0 = new MUser(); - u0.setUserName("user0"); - u0.addRole(r1); - u0.addRole(r2); + MUser u0 = new MUser(); + u0.setUserName("user0"); + u0.addRole(r1); + u0.addRole(r2); - Ebean.save(u0); + Ebean.save(u0); - MUser u1 = new MUser(); - u1.setUserName("user1"); - u1.addRole(r1); + MUser u1 = new MUser(); + u1.setUserName("user1"); + u1.addRole(r1); - Ebean.save(u1); + Ebean.save(u1); - MUser u2 = new MUser(); - u2.setUserName("user2"); - Ebean.save(u2); - - Ebean.commitTransaction(); + MUser u2 = new MUser(); + u2.setUserName("user2"); + Ebean.save(u2); + txn.commit(); + } Query query = Ebean.find(MUser.class).fetch("roles") // the where on a 'many' (like orders) requires an // additional join and distinct which is independent diff --git a/src/test/java/org/tests/rawsql/TestRawSqlNamedParams.java b/src/test/java/org/tests/rawsql/TestRawSqlNamedParams.java index c3703719b..e123f30f0 100644 --- a/src/test/java/org/tests/rawsql/TestRawSqlNamedParams.java +++ b/src/test/java/org/tests/rawsql/TestRawSqlNamedParams.java @@ -49,7 +49,6 @@ public class TestRawSqlNamedParams extends BaseTestCase { ResetBasicData.reset(); Transaction transaction = Ebean.beginTransaction(); - try { CallableSql callableSql = Ebean.createCallableSql("set @total = 0"); Ebean.execute(callableSql); diff --git a/src/test/java/org/tests/rawsql/TestRawSqlWithResultSet.java b/src/test/java/org/tests/rawsql/TestRawSqlWithResultSet.java index 238d203a2..5c80f071d 100644 --- a/src/test/java/org/tests/rawsql/TestRawSqlWithResultSet.java +++ b/src/test/java/org/tests/rawsql/TestRawSqlWithResultSet.java @@ -23,11 +23,11 @@ public class TestRawSqlWithResultSet extends BaseTestCase { ResetBasicData.reset(); - // Transaction supplies our jdbc Connection - Transaction txn = Ebean.beginTransaction(); PreparedStatement pstmt = null; + // Transaction supplies our jdbc Connection + Transaction txn = Ebean.beginTransaction(); try { pstmt = txn.getConnection().prepareStatement("select id, name, billing_address_id from o_customer"); diff --git a/src/test/java/org/tests/timezone/TimezoneTests.java b/src/test/java/org/tests/timezone/TimezoneTests.java index a0b3e4db0..7f144f77f 100644 --- a/src/test/java/org/tests/timezone/TimezoneTests.java +++ b/src/test/java/org/tests/timezone/TimezoneTests.java @@ -44,22 +44,21 @@ public class TimezoneTests { } private void fetch() throws SQLException { - Transaction transaction = Ebean.beginTransaction(); - Connection connection = transaction.getConnection(); + try ( + Transaction transaction = Ebean.beginTransaction(); + Connection connection = transaction.getConnection(); + PreparedStatement statement = connection.prepareStatement("select * from tztest"); + ResultSet resultSet = statement.executeQuery()) { - PreparedStatement statement = connection.prepareStatement("select * from tztest"); - ResultSet resultSet = statement.executeQuery(); - while (resultSet.next()) { - System.out.println(" zone:" + resultSet.getString("zone")); - System.out.println(" ts:" + tsof(resultSet.getTimestamp("ts"))); - System.out.println(" tstz:" + tsof(resultSet.getTimestamp("tstz"))); - System.out.println(" ts1:" + tsof(resultSet.getTimestamp("ts1", cal()))); - System.out.println("tstz1:" + tsof(resultSet.getTimestamp("tstz1", cal()))); + while (resultSet.next()) { + System.out.println(" zone:" + resultSet.getString("zone")); + System.out.println(" ts:" + tsof(resultSet.getTimestamp("ts"))); + System.out.println(" tstz:" + tsof(resultSet.getTimestamp("tstz"))); + System.out.println(" ts1:" + tsof(resultSet.getTimestamp("ts1", cal()))); + System.out.println("tstz1:" + tsof(resultSet.getTimestamp("tstz1", cal()))); + } + System.out.println(""); } - System.out.println(""); - resultSet.close(); - statement.close(); - transaction.end(); } private String tsof(Timestamp timestamp) { @@ -79,17 +78,19 @@ public class TimezoneTests { setZone(zone); } - Transaction transaction = Ebean.beginTransaction(); - Connection connection = transaction.getConnection(); - PreparedStatement statement = connection.prepareStatement(insert); - statement.setString(1, zone); - statement.setTimestamp(2, nowTs); - statement.setTimestamp(3, nowTs); - statement.setTimestamp(4, nowTs, cal()); - statement.setTimestamp(5, nowTs, cal()); - statement.executeUpdate(); + try ( + Transaction transaction = Ebean.beginTransaction(); + Connection connection = transaction.getConnection(); + PreparedStatement statement = connection.prepareStatement(insert)) { + statement.setString(1, zone); + statement.setTimestamp(2, nowTs); + statement.setTimestamp(3, nowTs); + statement.setTimestamp(4, nowTs, cal()); + statement.setTimestamp(5, nowTs, cal()); + statement.executeUpdate(); - transaction.commit(); + transaction.commit(); + } } private Calendar cal() { diff --git a/src/test/java/org/tests/transaction/TestAutoCommitDataSource.java b/src/test/java/org/tests/transaction/TestAutoCommitDataSource.java index 2fd66a13d..28ab7d2f0 100644 --- a/src/test/java/org/tests/transaction/TestAutoCommitDataSource.java +++ b/src/test/java/org/tests/transaction/TestAutoCommitDataSource.java @@ -65,30 +65,30 @@ public class TestAutoCommitDataSource extends BaseTestCase { UTMaster bean3 = new UTMaster("three3"); // use a different transaction to do final query check - Transaction otherTxn = ebeanServer.createTransaction(); - Transaction txn = ebeanServer.beginTransaction(); + try (Transaction otherTxn = ebeanServer.createTransaction()) { - assertTrue(txn.getConnection().getAutoCommit()); + Transaction txn = ebeanServer.beginTransaction(); + try { + assertTrue(txn.getConnection().getAutoCommit()); + ebeanServer.save(bean1); + ebeanServer.save(bean2); - try { - ebeanServer.save(bean1); - ebeanServer.save(bean2); + Query query2 = ebeanServer.find(UTMaster.class); + details = ebeanServer.findList(query2, otherTxn); + assertEquals(2, details.size()); - Query query2 = ebeanServer.find(UTMaster.class); - details = ebeanServer.findList(query2, otherTxn); - assertEquals(2, details.size()); + ebeanServer.save(bean3); - ebeanServer.save(bean3); + txn.rollback(); - txn.rollback(); + } finally { + txn.end(); + } - } finally { - txn.end(); + Query query3 = ebeanServer.find(UTMaster.class); + details = ebeanServer.findList(query3, otherTxn); + assertEquals(3, details.size()); } - Query query3 = ebeanServer.find(UTMaster.class); - details = ebeanServer.findList(query3, otherTxn); - assertEquals(3, details.size()); - } } diff --git a/src/test/java/org/tests/transaction/TestBeanStateReset.java b/src/test/java/org/tests/transaction/TestBeanStateReset.java index e7f17d5e1..ad332da9c 100644 --- a/src/test/java/org/tests/transaction/TestBeanStateReset.java +++ b/src/test/java/org/tests/transaction/TestBeanStateReset.java @@ -61,7 +61,6 @@ public class TestBeanStateReset extends BaseTestCase { b.getCs().add(c); Transaction transaction = Ebean.beginTransaction(); - try { // turn off cascade ... transaction.setPersistCascade(false); diff --git a/src/test/java/org/tests/transaction/TestBeginTransactionWithExisting.java b/src/test/java/org/tests/transaction/TestBeginTransactionWithExisting.java index 757208367..eb61b7010 100644 --- a/src/test/java/org/tests/transaction/TestBeginTransactionWithExisting.java +++ b/src/test/java/org/tests/transaction/TestBeginTransactionWithExisting.java @@ -10,6 +10,7 @@ import javax.persistence.PersistenceException; import java.sql.Connection; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; public class TestBeginTransactionWithExisting extends BaseTestCase { @@ -30,7 +31,9 @@ public class TestBeginTransactionWithExisting extends BaseTestCase { Transaction txn = Ebean.beginTransaction(); try { - Ebean.beginTransaction(TxIsolation.READ_COMMITED); + try (Transaction txn2 = Ebean.beginTransaction(TxIsolation.READ_COMMITED)) { + fail("Expected persitenceException here"); + } } finally { txn.end(); diff --git a/src/test/java/org/tests/transaction/TestExplicitTransactionMode.java b/src/test/java/org/tests/transaction/TestExplicitTransactionMode.java index 1a9acff18..59ebdd121 100644 --- a/src/test/java/org/tests/transaction/TestExplicitTransactionMode.java +++ b/src/test/java/org/tests/transaction/TestExplicitTransactionMode.java @@ -77,29 +77,30 @@ public class TestExplicitTransactionMode extends BaseTestCase { UTMaster bean3 = new UTMaster("three3"); // use a different transaction to do final query check - Transaction otherTxn = ebeanServer.createTransaction(); - Transaction txn = ebeanServer.beginTransaction(); + try (Transaction otherTxn = ebeanServer.createTransaction()) { - try { - ebeanServer.save(bean1); - ebeanServer.save(bean2); + Transaction txn = ebeanServer.beginTransaction(); + try { + ebeanServer.save(bean1); + ebeanServer.save(bean2); - // not visible in other transaction - Query query2 = ebeanServer.find(UTMaster.class); - details = ebeanServer.findList(query2, otherTxn); - assertEquals(0, details.size()); + // not visible in other transaction + Query query2 = ebeanServer.find(UTMaster.class); + details = ebeanServer.findList(query2, otherTxn); + assertEquals(0, details.size()); - ebeanServer.save(bean3); + ebeanServer.save(bean3); - txn.commit(); + txn.commit(); - } finally { - txn.end(); + } finally { + txn.end(); + } + + // commit as expected + Query query3 = ebeanServer.find(UTMaster.class); + details = ebeanServer.findList(query3, otherTxn); + assertEquals(3, details.size()); } - - // commit as expected - Query query3 = ebeanServer.find(UTMaster.class); - details = ebeanServer.findList(query3, otherTxn); - assertEquals(3, details.size()); } } diff --git a/src/test/java/org/tests/transaction/TestPersistContextClear.java b/src/test/java/org/tests/transaction/TestPersistContextClear.java index d80caa0a9..06f9f2517 100644 --- a/src/test/java/org/tests/transaction/TestPersistContextClear.java +++ b/src/test/java/org/tests/transaction/TestPersistContextClear.java @@ -22,17 +22,17 @@ public class TestPersistContextClear extends BaseTestCase { ResetBasicData.reset(); ResetBasicData.createOrderCustAndOrder("testPc"); + Order order0 = null; Transaction t = Ebean.beginTransaction(); - SpiTransaction spiTxn = (SpiTransaction) t; - PersistenceContext pc = spiTxn.getPersistenceContext(); - - // no orders or customers in the PC - Assert.assertEquals(0, pc.size(Order.class)); - Assert.assertEquals(0, pc.size(Customer.class)); - - Order order0 = null; try { + SpiTransaction spiTxn = (SpiTransaction) t; + PersistenceContext pc = spiTxn.getPersistenceContext(); + + // no orders or customers in the PC + Assert.assertEquals(0, pc.size(Order.class)); + Assert.assertEquals(0, pc.size(Customer.class)); + EbeanServer server = Ebean.getServer(null); List list = server.find(Order.class).fetch("customer").fetch("details").findList(); diff --git a/src/test/java/org/tests/transaction/TestSqlServerBatch.java b/src/test/java/org/tests/transaction/TestSqlServerBatch.java index 38cd60050..e2a716ef6 100644 --- a/src/test/java/org/tests/transaction/TestSqlServerBatch.java +++ b/src/test/java/org/tests/transaction/TestSqlServerBatch.java @@ -22,8 +22,9 @@ public class TestSqlServerBatch extends BaseTestCase { @Test public void testBasicIdentityBatch() { - Transaction txn = Ebean.beginTransaction().setBatchMode(true).setBatchSize(3); + Transaction txn = Ebean.beginTransaction(); try { + txn.setBatchMode(true).setBatchSize(3); for (int i = 0; i < 10; i++) { ESimple model = new ESimple(); diff --git a/src/test/java/org/tests/transaction/TestStatelessUpdateClearPC.java b/src/test/java/org/tests/transaction/TestStatelessUpdateClearPC.java index 8e1b59924..bb2222038 100644 --- a/src/test/java/org/tests/transaction/TestStatelessUpdateClearPC.java +++ b/src/test/java/org/tests/transaction/TestStatelessUpdateClearPC.java @@ -15,24 +15,25 @@ public class TestStatelessUpdateClearPC extends BaseTestCase { Ebean.beginTransaction(); + try { + EBasic newUser = new EBasic(); + newUser.setName("any@email.com"); + Ebean.save(newUser); - EBasic newUser = new EBasic(); - newUser.setName("any@email.com"); - Ebean.save(newUser); + // load the bean into the persistence context + EBasic dummyLoadedUser = Ebean.find(EBasic.class, newUser.getId()); // This row is added + assertNotNull(dummyLoadedUser); - // load the bean into the persistence context - EBasic dummyLoadedUser = Ebean.find(EBasic.class, newUser.getId()); // This row is added - assertNotNull(dummyLoadedUser); + // stateless update (should clear the bean from the persistence context) + EBasic updateUser = new EBasic(); + updateUser.setId(newUser.getId()); + updateUser.setName("anyNew@email.com"); + Ebean.update(updateUser); - // stateless update (should clear the bean from the persistence context) - EBasic updateUser = new EBasic(); - updateUser.setId(newUser.getId()); - updateUser.setName("anyNew@email.com"); - Ebean.update(updateUser); - - EBasic loadedUser = Ebean.find(EBasic.class, newUser.getId()); - assertEquals("anyNew@email.com", loadedUser.getName()); - - Ebean.rollbackTransaction(); + EBasic loadedUser = Ebean.find(EBasic.class, newUser.getId()); + assertEquals("anyNew@email.com", loadedUser.getName()); + } finally { + Ebean.rollbackTransaction(); + } } } diff --git a/src/test/java/org/tests/transaction/TestTransactionCallback.java b/src/test/java/org/tests/transaction/TestTransactionCallback.java index 1c6b5ccbe..44e91f601 100644 --- a/src/test/java/org/tests/transaction/TestTransactionCallback.java +++ b/src/test/java/org/tests/transaction/TestTransactionCallback.java @@ -28,10 +28,11 @@ public class TestTransactionCallback extends BaseTestCase { public void test_commitAndRollback() { - Transaction txn = Ebean.beginTransaction(); - Ebean.register(new MyCallback()); - txn.getConnection(); - Ebean.commitTransaction(); + try (Transaction txn = Ebean.beginTransaction()) { + Ebean.register(new MyCallback()); + txn.getConnection(); + Ebean.commitTransaction(); + } assertEquals(1, countPreCommit); assertEquals(1, countPostCommit); @@ -39,8 +40,11 @@ public class TestTransactionCallback extends BaseTestCase { assertEquals(0, countPostRollback); Ebean.beginTransaction(); - Ebean.register(new MyCallback()); - Ebean.rollbackTransaction(); + try { + Ebean.register(new MyCallback()); + } finally { + Ebean.rollbackTransaction(); + } assertEquals(1, countPreCommit); assertEquals(1, countPostCommit); diff --git a/src/test/java/org/tests/update/TestSqlUpdateInTxn.java b/src/test/java/org/tests/update/TestSqlUpdateInTxn.java index 3ede3004d..3b167abc1 100644 --- a/src/test/java/org/tests/update/TestSqlUpdateInTxn.java +++ b/src/test/java/org/tests/update/TestSqlUpdateInTxn.java @@ -96,18 +96,20 @@ public class TestSqlUpdateInTxn extends BaseTestCase { Ebean.beginTransaction(); + try { + SqlUpdate update = Ebean.createSqlUpdate(updateDml); + update.setParameter("desc", "foo4"); + update.setParameter("id", id); + update.execute(); - SqlUpdate update = Ebean.createSqlUpdate(updateDml); - update.setParameter("desc", "foo4"); - update.setParameter("id", id); - update.execute(); - - updateMod = Ebean.createSqlUpdate(updateModDml); - updateMod.setParameter("desc", "mod2"); - updateMod.execute(); - - Ebean.commitTransaction(); + updateMod = Ebean.createSqlUpdate(updateModDml); + updateMod.setParameter("desc", "mod2"); + updateMod.execute(); + Ebean.commitTransaction(); + } finally { + Ebean.endTransaction(); + } AuditLog log5 = Ebean.find(AuditLog.class, log.getId()); Assert.assertEquals("foo4", log5.getDescription()); Assert.assertEquals("mod2", log5.getModifiedDescription());