From b896e55af15eb31009bfb2e3c58fa5e7b0d52de6 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 7 Nov 2013 23:07:39 +1300 Subject: [PATCH] Fix for Issue 56 - Using findIterate with MySQL streams the entire result set at once --- .../ebeaninternal/server/query/CQuery.java | 21 ++++++++++++++++++- .../server/query/CQueryEngine.java | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java index 20f036e07..0ad5c619c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java @@ -343,7 +343,21 @@ public class CQuery implements DbReadContext, CancelableQuery { } } + /** + * Prepare bind and execute query with Forward only hints. + */ + public boolean prepareBindExecuteQueryForwardOnly() throws SQLException { + return prepareBindExecuteQueryWithOption(true); + } + + /** + * Prepare bind and execute the query normally. + */ public boolean prepareBindExecuteQuery() throws SQLException { + return prepareBindExecuteQueryWithOption(false); + } + + private boolean prepareBindExecuteQueryWithOption(boolean forward) throws SQLException { synchronized (this) { if (cancelled || query.isCancelled()) { @@ -357,7 +371,12 @@ public class CQuery implements DbReadContext, CancelableQuery { // prepare SpiTransaction t = request.getTransaction(); Connection conn = t.getInternalConnection(); - pstmt = conn.prepareStatement(sql); + if (forward) { + // Hints required for mysql for large resultset processing (Issue 56) + pstmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + } else { + pstmt = conn.prepareStatement(sql); + } if (query.getTimeout() > 0) { pstmt.setQueryTimeout(query.getTimeout()); diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java index af3ea921e..844f26af9 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java @@ -122,7 +122,7 @@ public class CQueryEngine { try { - if (!cquery.prepareBindExecuteQuery()) { + if (!cquery.prepareBindExecuteQueryForwardOnly()) { // query has been cancelled already logger.trace("Future fetch already cancelled"); return null;