From 0fd2f34ed0189c5418f9c977b0bdb01e170dd6c0 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Wed, 9 Nov 2022 09:46:51 +0100 Subject: [PATCH 1/2] Possible bug: Setting isolation level disables query cache --- .../java/org/tests/cache/TestQueryCache.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/ebean-test/src/test/java/org/tests/cache/TestQueryCache.java b/ebean-test/src/test/java/org/tests/cache/TestQueryCache.java index 6e254ea6c..e11585d4b 100644 --- a/ebean-test/src/test/java/org/tests/cache/TestQueryCache.java +++ b/ebean-test/src/test/java/org/tests/cache/TestQueryCache.java @@ -3,6 +3,8 @@ package org.tests.cache; import io.ebean.CacheMode; import io.ebean.DB; import io.ebean.ExpressionList; +import io.ebean.annotation.Transactional; +import io.ebean.annotation.TxIsolation; import io.ebean.bean.BeanCollection; import io.ebean.cache.ServerCache; import io.ebean.test.LoggedSql; @@ -159,6 +161,30 @@ public class TestQueryCache extends BaseTestCase { assertThat(count2).isEqualTo(count1); sql = LoggedSql.stop(); assertThat(sql).hasSize(1); + + + LoggedSql.start(); + findCountNoTxn(); + sql = LoggedSql.stop(); + assertThat(sql).hasSize(0); + + LoggedSql.start(); + findCountTxn(); + sql = LoggedSql.stop(); + assertThat(sql).hasSize(0); + } + + private void findCountNoTxn() { + DB.find(EColAB.class) + .setUseQueryCache(CacheMode.ON) + .where() + .eq("columnB", "count") + .findCount(); + } + + @Transactional(isolation = TxIsolation.READ_UNCOMMITTED) + private void findCountTxn() { + findCountNoTxn(); } @Test From 6e9a8704b4cf575f9be57e1f12d6557a0547eca8 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 10 Nov 2022 12:32:23 +1300 Subject: [PATCH 2/2] #2887 - Fix for Setting isolation level disables query cache Use getInternalConnection() in order to set the queryOnly = false flag which is done via connection() --- .../main/java/io/ebeaninternal/server/query/CQueryBuilder.java | 2 +- .../io/ebeaninternal/server/transaction/TransactionFactory.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index acb3e1708..b0fcd7f17 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -396,7 +396,7 @@ final class CQueryBuilder { sql = nativeQueryPaging(query, sql); } query.setGeneratedSql(sql); - Connection connection = request.transaction().connection(); + Connection connection = request.transaction().getInternalConnection(); BeanDescriptor desc = request.descriptor(); try { // For SqlServer we need either "selectMethod=cursor" in the connection string or fetch explicitly a cursorable diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java index ea2bc8aa0..cf8f4591b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/TransactionFactory.java @@ -35,7 +35,7 @@ abstract class TransactionFactory { */ final SpiTransaction setIsolationLevel(SpiTransaction t, boolean explicit, int isolationLevel) { if (isolationLevel > -1) { - Connection connection = t.connection(); + Connection connection = t.getInternalConnection(); try { connection.setTransactionIsolation(isolationLevel); } catch (SQLException e) {