From 507027df0ae048b1cee2a41fb3795e3187b12385 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 17 Aug 2022 16:17:26 +1200 Subject: [PATCH] #2782 #2783 - Forward only fetchSize() for MySql and MariaDB is Integer.MIN_VALUE and 1 respectively --- .../server/core/OrmQueryEngine.java | 2 ++ .../server/core/OrmQueryRequest.java | 4 +++ .../io/ebeaninternal/server/query/CQuery.java | 2 +- .../server/query/CQueryEngine.java | 12 +++---- .../server/query/DefaultOrmQueryEngine.java | 32 ++++--------------- 5 files changed, 20 insertions(+), 32 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java index d3ca32b6d..d29beebe0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java @@ -73,4 +73,6 @@ public interface OrmQueryEngine { * Return true if multi-value bind is supported for this type (and current platform). */ boolean isMultiValueSupported(Class valueType); + + int forwardOnlyFetchSize(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java index 423d6687b..6388de507 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java @@ -761,4 +761,8 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery public boolean isInlineSqlUpdateLimit() { return query.getMaxRows() < 1 || server.databasePlatform().isInlineSqlUpdateLimit(); } + + public int forwardOnlyFetchSize() { + return queryEngine.forwardOnlyFetchSize(); + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java index f8fd3144f..22b440e42 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQuery.java @@ -314,7 +314,7 @@ public final class CQuery implements DbReadContext, CancelableQuery, SpiProfi if (forwardOnlyHint) { // Use forward only hints for large resultSet processing (Issue 56, MySql specific) pstmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - pstmt.setFetchSize(1); + pstmt.setFetchSize(request.forwardOnlyFetchSize()); } else { pstmt = conn.prepareStatement(sql); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java index 26d728c36..df78f11e7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.query; import io.ebean.QueryIterator; import io.ebean.ValuePair; import io.ebean.Version; +import io.ebean.annotation.Platform; import io.ebean.bean.BeanCollection; import io.ebean.bean.EntityBean; import io.ebean.bean.ObjectGraphNode; @@ -32,19 +33,13 @@ import java.util.*; public final class CQueryEngine { private static final Logger log = CoreLog.log; - private static final String T0 = "t0"; private final int defaultFetchSizeFindList; - private final int defaultFetchSizeFindEach; - private final boolean forwardOnlyHintOnFindIterate; - private final CQueryBuilder queryBuilder; - private final CQueryHistorySupport historySupport; - private final DatabasePlatform dbPlatform; public CQueryEngine(DatabaseConfig config, DatabasePlatform dbPlatform, Binder binder, Map asOfTableMapping, Map draftTableMap) { @@ -56,6 +51,11 @@ public final class CQueryEngine { this.queryBuilder = new CQueryBuilder(dbPlatform, binder, historySupport, new CQueryDraftSupport(draftTableMap)); } + public int forwardOnlyFetchSize() { + Platform base = dbPlatform.getPlatform().base(); + return Platform.MYSQL == base ? Integer.MIN_VALUE : 1; + } + public CQuery buildQuery(OrmQueryRequest request) { return queryBuilder.buildQuery(request); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java index 95c5dbe7e..98a2ca471 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -17,25 +17,19 @@ import javax.persistence.PersistenceException; import java.sql.SQLException; import java.util.Collection; import java.util.List; -import java.util.Set; -/** - * Main Finder implementation. - */ public final class DefaultOrmQueryEngine implements OrmQueryEngine { - /** - * Find using predicates - */ private final CQueryEngine queryEngine; - private final Binder binder; + private final int forwardOnlyFetchSize; /** * Create the Finder. */ public DefaultOrmQueryEngine(CQueryEngine queryEngine, Binder binder) { this.queryEngine = queryEngine; + this.forwardOnlyFetchSize = queryEngine.forwardOnlyFetchSize(); this.binder = binder; } @@ -44,6 +38,11 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { return queryEngine.translate(request, bindLog, sql, e); } + @Override + public int forwardOnlyFetchSize() { + return forwardOnlyFetchSize; + } + @Override public boolean isMultiValueSupported(Class cls) { return binder.isMultiValueSupported(cls); @@ -53,7 +52,6 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { * Flushes the jdbc batch by default unless explicitly turned off on the transaction. */ private void flushJdbcBatchOnQuery(OrmQueryRequest request) { - SpiTransaction t = request.transaction(); if (t.isFlushOnQuery()) { // before we perform a query, we need to flush any @@ -65,14 +63,12 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { @Override public int delete(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.delete(request); } @Override public int update(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.update(request); } @@ -85,14 +81,12 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { @Override public int findCount(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.findCount(request); } @Override public List findIds(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.findIds(request); } @@ -112,16 +106,13 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { @Override public List> findVersions(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); return queryEngine.findVersions(request); } @Override public BeanCollection findMany(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); - BeanFindController finder = request.finder(); BeanCollection result; @@ -131,13 +122,11 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { } else { result = queryEngine.findMany(request); } - if (finder != null) { result = finder.postProcessMany(request, result); } SpiQuery query = request.query(); - if (result != null && request.isBeanCachePutMany()) { // load the individual beans into the bean cache BeanDescriptor descriptor = request.descriptor(); @@ -146,7 +135,6 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { } request.mergeCacheHits(result); - if (request.isQueryCachePut()) { // load the query result into the query cache result.setReadOnly(true); @@ -155,7 +143,6 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { result = result.getShallowCopy(); } } - return result; } @@ -164,9 +151,7 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { */ @Override public T findId(OrmQueryRequest request) { - flushJdbcBatchOnQuery(request); - BeanFindController finder = request.finder(); T result; @@ -175,15 +160,12 @@ public final class DefaultOrmQueryEngine implements OrmQueryEngine { } else { result = queryEngine.find(request); } - if (finder != null) { result = finder.postProcess(request, result); } - if (result != null && request.isBeanCachePut()) { request.descriptor().cacheBeanPut((EntityBean) result); } - return result; }