From 759cab3fc448aeb63cf79a4e40f4cf9b0ee97c0a Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 28 Oct 2013 17:55:48 +0100 Subject: [PATCH] [#2806] Add ResultQuery.fetchSize() to influence the JDBC Statement's fetch size --- jOOQ/src/main/java/org/jooq/ResultQuery.java | 11 ++++++++++ .../org/jooq/impl/AbstractResultQuery.java | 20 ++++++++++++------- .../main/java/org/jooq/impl/SelectImpl.java | 5 +++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/ResultQuery.java b/jOOQ/src/main/java/org/jooq/ResultQuery.java index b5b4fb39a1..31b414b649 100644 --- a/jOOQ/src/main/java/org/jooq/ResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/ResultQuery.java @@ -1018,6 +1018,17 @@ public interface ResultQuery extends Query { */ ResultQuery maxRows(int rows); + /** + * Specify the fetch size of the underlying {@link Statement}. + *

+ * Regardless of this setting, {@link #fetchLazy()} is the only way in jOOQ + * not to fetch all data in memory. However, you may influence how your JDBC + * driver interacts with your database through specifying a fetch size. + * + * @see Statement#setFetchSize(int) + */ + ResultQuery fetchSize(int rows); + /** * Specify the ResultSet concurrency of ResultSet * objects created by jOOQ. diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java index 11c07d02a1..b3a064b3b9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java @@ -90,11 +90,11 @@ abstract class AbstractResultQuery extends AbstractQuery imple private static final JooqLogger log = JooqLogger.getLogger(AbstractResultQuery.class); private int maxRows; + private int fetchSize; private int resultSetConcurrency; private int resultSetType; private int resultSetHoldability; private transient boolean lazy; - private transient int size; private transient boolean many; private transient Cursor cursor; private Result result; @@ -144,6 +144,12 @@ abstract class AbstractResultQuery extends AbstractQuery imple return this; } + @Override + public final ResultQuery fetchSize(int rows) { + this.fetchSize = rows; + return this; + } + @Override public final ResultQuery resultSetConcurrency(int concurrency) { this.resultSetConcurrency = concurrency; @@ -226,11 +232,11 @@ abstract class AbstractResultQuery extends AbstractQuery imple // [#1263] Allow for negative fetch sizes to support some non-standard // MySQL feature, where Integer.MIN_VALUE is used - if (size != 0) { + if (fetchSize != 0) { if (log.isDebugEnabled()) - log.debug("Setting fetch size", size); + log.debug("Setting fetch size", fetchSize); - ctx.statement().setFetchSize(size); + ctx.statement().setFetchSize(fetchSize); } // [#1854] Set the max number of rows for this result query @@ -336,16 +342,16 @@ abstract class AbstractResultQuery extends AbstractQuery imple } @Override - public final Cursor fetchLazy(int fetchSize) { + public final Cursor fetchLazy(int size) { lazy = true; - size = fetchSize; + fetchSize = size; try { execute(); } finally { lazy = false; - size = 0; + fetchSize = 0; } return cursor; diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java index 0cd06ca9bf..c571514383 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java @@ -1623,6 +1623,11 @@ class SelectImpl fetchSize(int rows) { + return getDelegate().fetchSize(rows); + } + @Override public final ResultQuery resultSetConcurrency(int resultSetConcurrency) { return getDelegate().resultSetConcurrency(resultSetConcurrency);