From bf75af85c1f2f84b92079a282d4d914c5e09619a Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Fri, 29 Apr 2016 09:05:36 +1200 Subject: [PATCH] #681 - Remove SqlQuery.cancel() ... migrate to SqlQuery.findEachWhile() and stop while iterating --- src/main/java/com/avaje/ebean/SqlQuery.java | 30 +++----- .../avaje/ebeaninternal/api/SpiSqlQuery.java | 14 ---- .../server/core/RelationalQueryRequest.java | 74 ++++++------------- .../query/DefaultRelationalQueryEngine.java | 35 ++------- .../querydefn/DefaultRelationalQuery.java | 33 --------- 5 files changed, 42 insertions(+), 144 deletions(-) diff --git a/src/main/java/com/avaje/ebean/SqlQuery.java b/src/main/java/com/avaje/ebean/SqlQuery.java index fff30310e..9541f7e69 100644 --- a/src/main/java/com/avaje/ebean/SqlQuery.java +++ b/src/main/java/com/avaje/ebean/SqlQuery.java @@ -21,31 +21,25 @@ import java.util.Set; * conversion support added. *

* - *
- * // its typically a good idea to use a named query
- * // and put the sql in the orm.xml instead of in your code
+ * 
{@code
+ *
+ *   // its typically a good idea to use a named query
+ *   // and put the sql in the orm.xml instead of in your code
  * 
- * String sql = "select id, name from customer where name like :name and status_code = :status";
+ *   String sql = "select id, name from customer where name like :name and status_code = :status";
  * 
- * SqlQuery sqlQuery = Ebean.createSqlQuery(sql);
- * sqlQuery.setParameter("name", "Acme%");
- * sqlQuery.setParameter("status", "ACTIVE");
+ *   SqlQuery sqlQuery = Ebean.createSqlQuery(sql);
+ *   sqlQuery.setParameter("name", "Acme%");
+ *   sqlQuery.setParameter("status", "ACTIVE");
  * 
- * // execute the query returning a List of MapBean objects
- * List<SqlRow> list = sqlQuery.findList();
- * 
+ * // execute the query returning a List of MapBean objects + * List list = sqlQuery.findList(); + * + * }
* */ public interface SqlQuery extends Serializable { - /** - * Cancel the query if support by the underlying database and driver. - *

- * This must be called from a different thread to the one executing the query. - *

- */ - void cancel(); - /** * Execute the query returning a list. */ diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiSqlQuery.java b/src/main/java/com/avaje/ebeaninternal/api/SpiSqlQuery.java index 0087457fe..292d47bf3 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiSqlQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiSqlQuery.java @@ -39,23 +39,9 @@ public interface SpiSqlQuery extends SqlQuery { */ int getBufferFetchSizeHint(); - /** - * Return true if this is a future fetch type query. - */ - boolean isFutureFetch(); - - /** - * Set to true if this is a future fetch type query. - */ - void setFutureFetch(boolean futureFetch); - /** * Set the PreparedStatement for the purposes of supporting cancel. */ void setPreparedStatement(PreparedStatement pstmt); - /** - * Return true if the query has been cancelled. - */ - boolean isCancelled(); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/RelationalQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/RelationalQueryRequest.java index 1dc4f1c69..1eeac35ca 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/RelationalQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/RelationalQueryRequest.java @@ -8,7 +8,6 @@ import com.avaje.ebean.SqlRow; import com.avaje.ebean.Transaction; import com.avaje.ebeaninternal.api.BindParams; import com.avaje.ebeaninternal.api.SpiEbeanServer; -import com.avaje.ebeaninternal.api.SpiQuery; import com.avaje.ebeaninternal.api.SpiSqlQuery; import com.avaje.ebeaninternal.api.SpiTransaction; import com.avaje.ebeaninternal.server.lib.util.Str; @@ -46,8 +45,6 @@ public final class RelationalQueryRequest { private boolean createdTransaction; - private SpiQuery.Type queryType; - private String sql; private ResultSet resultSet; @@ -96,17 +93,14 @@ public final class RelationalQueryRequest { } public void findEach(QueryEachConsumer consumer) { - queryType = SpiQuery.Type.ITERATE; queryEngine.findEach(this, consumer); } public void findEachWhile(QueryEachWhileConsumer consumer) { - queryType = SpiQuery.Type.ITERATE; queryEngine.findEach(this, consumer); } public List findList() { - queryType = SpiQuery.Type.LIST; return queryEngine.findList(this); } @@ -117,13 +111,6 @@ public final class RelationalQueryRequest { return query; } - /** - * Return the type (List, Set or Map) that this fetch returns. - */ - public SpiQuery.Type getQueryType() { - return queryType; - } - public EbeanServer getEbeanServer() { return ebeanServer; } @@ -231,49 +218,36 @@ public final class RelationalQueryRequest { /** * Prepare and execute the SQL using the Binder. */ - public boolean executeSql(Binder binder) throws SQLException { + public void executeSql(Binder binder) throws SQLException { prepareSql(); - synchronized (query) { - if (query.isCancelled()) { - logger.trace("Query already cancelled"); - return false; - } - Connection conn = trans.getInternalConnection(); + Connection conn = trans.getInternalConnection(); - // synchronise for query.cancel() support - pstmt = conn.prepareStatement(sql); - if (query.getTimeout() > 0) { - pstmt.setQueryTimeout(query.getTimeout()); - } - if (query.getBufferFetchSizeHint() > 0) { - pstmt.setFetchSize(query.getBufferFetchSizeHint()); - } - - BindParams bindParams = query.getBindParams(); - if (!bindParams.isEmpty()) { - this.bindLog = binder.bind(bindParams, pstmt); - } - - if (isLogSql()) { - String logSql = sql; - if (TransactionManager.SQL_LOGGER.isTraceEnabled()) { - logSql = Str.add(logSql, "; --bind(", bindLog, ")"); - } - trans.logSql(logSql); - } - - setResultSet(pstmt.executeQuery()); - return true; + // synchronise for query.cancel() support + pstmt = conn.prepareStatement(sql); + if (query.getTimeout() > 0) { + pstmt.setQueryTimeout(query.getTimeout()); + } + if (query.getBufferFetchSizeHint() > 0) { + pstmt.setFetchSize(query.getBufferFetchSizeHint()); } - } - /** - * Return true if the query has been cancelled. - */ - public boolean isCancelled() { - return query.isCancelled(); + BindParams bindParams = query.getBindParams(); + if (!bindParams.isEmpty()) { + this.bindLog = binder.bind(bindParams, pstmt); + } + + if (isLogSql()) { + String logSql = sql; + if (TransactionManager.SQL_LOGGER.isTraceEnabled()) { + logSql = Str.add(logSql, "; --bind(", bindLog, ")"); + } + trans.logSql(logSql); + } + + setResultSet(pstmt.executeQuery()); + } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultRelationalQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultRelationalQueryEngine.java index 7c25a85ad..4a4c7074b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultRelationalQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultRelationalQueryEngine.java @@ -3,13 +3,10 @@ package com.avaje.ebeaninternal.server.query; import com.avaje.ebean.QueryEachConsumer; import com.avaje.ebean.QueryEachWhileConsumer; import com.avaje.ebean.SqlRow; -import com.avaje.ebeaninternal.api.SpiSqlQuery; import com.avaje.ebeaninternal.server.core.Message; import com.avaje.ebeaninternal.server.core.RelationalQueryEngine; import com.avaje.ebeaninternal.server.core.RelationalQueryRequest; import com.avaje.ebeaninternal.server.persist.Binder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.persistence.PersistenceException; import java.sql.SQLException; @@ -21,9 +18,6 @@ import java.util.List; */ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { - private static final Logger logger = LoggerFactory.getLogger(DefaultRelationalQueryEngine.class); - - private final Binder binder; private final String dbTrueValue; @@ -78,9 +72,7 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { long startTime = System.currentTimeMillis(); try { - if (!request.executeSql(binder)) { - return null; - } + request.executeSql(binder); int maxRows = request.getMaxRows(); @@ -88,23 +80,12 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { List rows = new ArrayList(); - SpiSqlQuery query = request.getQuery(); - while (request.next()) { - SqlRow bean; - synchronized (query) { - if (request.isCancelled()) { - break; - } - bean = readRow(request); - } - if (bean != null) { - rows.add(bean); - loadRowCount++; - if (loadRowCount == maxRows) { - // break, as we have hit the max rows to fetch... - break; - } + rows.add(readRow(request)); + loadRowCount++; + if (loadRowCount == maxRows) { + // break, as we have hit the max rows to fetch... + break; } } @@ -126,10 +107,6 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { long exeTime = System.currentTimeMillis() - startTime; request.getTransaction().logSummary("SqlQuery rows[" + request.getRowCount() + "] time[" + exeTime + "] bind[" + request.getBindLog() + "]"); } - - if (request.isCancelled()) { - logger.debug("Query was cancelled during execution rows: {}", request.getRowCount()); - } } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultRelationalQuery.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultRelationalQuery.java index 0866240aa..97eed9b0f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultRelationalQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultRelationalQuery.java @@ -7,9 +7,7 @@ import com.avaje.ebean.SqlRow; import com.avaje.ebeaninternal.api.BindParams; import com.avaje.ebeaninternal.api.SpiSqlQuery; -import javax.persistence.PersistenceException; import java.sql.PreparedStatement; -import java.sql.SQLException; import java.util.List; /** @@ -29,10 +27,6 @@ public class DefaultRelationalQuery implements SpiSqlQuery { private int timeout; - private boolean futureFetch; - - private boolean cancelled; - /** * For the purposes of cancelling the query. */ @@ -134,37 +128,10 @@ public class DefaultRelationalQuery implements SpiSqlQuery { return query; } - public boolean isFutureFetch() { - return futureFetch; - } - - public void setFutureFetch(boolean futureFetch) { - this.futureFetch = futureFetch; - } - public void setPreparedStatement(PreparedStatement pstmt) { synchronized (this) { this.pstmt = pstmt; } } - public void cancel() { - synchronized (this) { - this.cancelled = true; - if (pstmt != null) { - try { - pstmt.cancel(); - } catch (SQLException e) { - throw new PersistenceException("Error cancelling query", e); - } - } - } - } - - public boolean isCancelled() { - synchronized (this) { - return cancelled; - } - } - }