diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java index 8c2bc7f529..915df9e098 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/SequenceIdGenerator.java @@ -157,7 +157,7 @@ protected List getMoreIds(int requestSize) { if (newIds.isEmpty()) { throw new PersistenceException("Always expecting more than 1 row from " + sql); } - + connection.commit(); return newIds; } catch (SQLException e) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java index d0b0d17759..2bb14eb38c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java @@ -77,7 +77,12 @@ private DatabasePlatform byDatabaseName(String dbName) { */ private DatabasePlatform byDataSource(DataSource dataSource) { try (Connection connection = dataSource.getConnection()) { - return byDatabaseMeta(connection.getMetaData(), connection); + DatabasePlatform platform = byDatabaseMeta(connection.getMetaData(), connection); + if (!connection.getAutoCommit()) { + // we must roll back before close. + connection.rollback(); + } + return platform; } catch (SQLException ex) { throw new PersistenceException(ex); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java index c0f7174489..bdc7b7d127 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java @@ -262,6 +262,8 @@ private boolean checkDataSource(DatabaseBuilder.Settings config) { try (Connection connection = config.getDataSource().getConnection()) { if (connection.getAutoCommit()) { log.log(WARNING, "DataSource [{0}] has autoCommit defaulting to true!", config.getName()); + } else { + connection.rollback(); } return true; } catch (SQLException ex) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java index b3a4091d41..0ad0f2d498 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlanManager.java @@ -63,6 +63,13 @@ private List collectPlans(QueryPlanRequest request) { while (req.hasNext()) { req.nextCapture(); } + if (!connection.getAutoCommit()) { + // CHECKME: commit or rollback here? + // arguments for rollback: the collecting should never modify data. + // if there are collectors that may copy the plan into tables, it's up to the collector to + // commit the transaction. + connection.rollback(); + } return req.plans(); } catch (SQLException e) { CoreLog.log.log(ERROR, "Error during query plan collection", e); diff --git a/ebean-querybean/src/test/java/org/querytest/QCustomerTest.java b/ebean-querybean/src/test/java/org/querytest/QCustomerTest.java index 001638655b..94bc120981 100644 --- a/ebean-querybean/src/test/java/org/querytest/QCustomerTest.java +++ b/ebean-querybean/src/test/java/org/querytest/QCustomerTest.java @@ -442,6 +442,7 @@ public void usingConnection() throws SQLException { .usingConnection(connection) .findList(); + connection.rollback(); assertThat(foo).hasSize(1); } diff --git a/ebean-querybean/src/test/resources/application-test.properties b/ebean-querybean/src/test/resources/application-test.properties index 40926ea64d..f52f344e36 100644 --- a/ebean-querybean/src/test/resources/application-test.properties +++ b/ebean-querybean/src/test/resources/application-test.properties @@ -11,6 +11,7 @@ datasource.default=h2 datasource.h2.username=sa datasource.h2.password= datasource.h2.url=jdbc:h2:mem:tests;NON_KEYWORDS=KEY,VALUE +datasource.h2.closeWithinTxn=fail datasource.pg.username=sa datasource.pg.password= diff --git a/ebean-test/src/test/java/io/ebean/xtest/dbmigration/DbMigrationTest.java b/ebean-test/src/test/java/io/ebean/xtest/dbmigration/DbMigrationTest.java index 6671d4bc5e..77e34470e0 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/dbmigration/DbMigrationTest.java +++ b/ebean-test/src/test/java/io/ebean/xtest/dbmigration/DbMigrationTest.java @@ -220,7 +220,7 @@ private void testVersioning() { config.setName(server().name()); config.loadFromProperties(server().pluginApi().config().getProperties()); config.setDataSource(server().dataSource()); - config.setReadOnlyDataSource(server().dataSource()); + config.setReadOnlyDataSource(server().readOnlyDataSource()); config.setDdlGenerate(false); config.setDdlRun(false); config.setRegister(false); @@ -292,7 +292,7 @@ private void testReservedKeywords() { config.setName(server().name()); config.loadFromProperties(server().pluginApi().config().getProperties()); config.setDataSource(server().dataSource()); - config.setReadOnlyDataSource(server().dataSource()); + config.setReadOnlyDataSource(server().readOnlyDataSource()); config.setDdlGenerate(false); config.setDdlRun(false); config.setRegister(false); diff --git a/ebean-test/src/test/java/io/ebean/xtest/internal/server/rawsql/TestRawSqlBuilder.java b/ebean-test/src/test/java/io/ebean/xtest/internal/server/rawsql/TestRawSqlBuilder.java index 890ac4c7f9..0e653ee9f5 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/internal/server/rawsql/TestRawSqlBuilder.java +++ b/ebean-test/src/test/java/io/ebean/xtest/internal/server/rawsql/TestRawSqlBuilder.java @@ -266,6 +266,7 @@ public void findDuplicateColumnName() throws SQLException { } } } + connection.rollback(); } } diff --git a/ebean-test/src/test/java/org/tests/basic/TestQueryUsingConnection.java b/ebean-test/src/test/java/org/tests/basic/TestQueryUsingConnection.java index 039c6e6179..3923636927 100644 --- a/ebean-test/src/test/java/org/tests/basic/TestQueryUsingConnection.java +++ b/ebean-test/src/test/java/org/tests/basic/TestQueryUsingConnection.java @@ -32,6 +32,7 @@ public void usingConnection() throws SQLException { .findCount(); assertThat(count).isGreaterThan(0); + connection.rollback(); } } diff --git a/ebean-test/src/test/resources/ebean.properties b/ebean-test/src/test/resources/ebean.properties index 6e3485c75b..692f6ddc6d 100644 --- a/ebean-test/src/test/resources/ebean.properties +++ b/ebean-test/src/test/resources/ebean.properties @@ -76,6 +76,7 @@ datasource.db.databaseDriver=org.h2.Driver datasource.h2.username=sa datasource.h2.password= datasource.h2.url=jdbc:h2:mem:testsMem;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=KEY,VALUE +datasource.h2.closeWithinTxn=fail datasource.h2.poolListener=org.tests.basic.MyTestDataSourcePoolListener #datasource.h2.minConnections=1 #datasource.h2.maxConnections=25