diff --git a/jOOQ/src/main/java/org/jooq/ExecuteContext.java b/jOOQ/src/main/java/org/jooq/ExecuteContext.java index b23692b942..5cec22346b 100644 --- a/jOOQ/src/main/java/org/jooq/ExecuteContext.java +++ b/jOOQ/src/main/java/org/jooq/ExecuteContext.java @@ -38,6 +38,8 @@ package org.jooq; import java.sql.PreparedStatement; import java.sql.ResultSet; +import org.jooq.conf.StatementType; + /** * A context object for {@link Query} execution passed to registered * {@link ExecuteListener}'s. @@ -45,43 +47,109 @@ import java.sql.ResultSet; * Expect most of this context's objects to be nullable! * * @author Lukas Eder + * @see ExecuteListener */ public interface ExecuteContext extends Configuration { + /** + * The configuration wrapped by this context + */ Configuration configuration(); - // TODO Routines? - // Nullable! + /** + * The jOOQ {@link Query} that is being executed or null if the + * query is unknown or if there was no jOOQ Query + * + * @see #routine() + */ Query query(); - // Nullable! - void sql(String sql); + /** + * The jOOQ {@link Routine} that is being executed or null if + * the query is unknown or if there was no jOOQ Routine + * + * @see #routine() + */ + Routine routine(); + /** + * The SQL that is being executed or null if the SQL statement + * is unknown or if there was no SQL statement + */ String sql(); /** - * Override the context's {@link PreparedStatement} + * Override the SQL statement that is being executed. This may have no + * effect, if called at the wrong moment. + * + * @see ExecuteListener#renderEnd(ExecuteContext) + * @see ExecuteListener#prepareStart(ExecuteContext) + */ + void sql(String sql); + + /** + * The {@link PreparedStatement} that is being executed or null + * if the statement is unknown or if there was no statement. *

- * Use this to wrap the PreparedStatement executed by jOOQ with - * your custom wrapper statement, logging bind variables and query - * execution. Beware + * This can be any of the following:
+ *
+ *

+ */ + PreparedStatement statement(); + + /** + * Override the {@link PreparedStatement} that is being executed. This may + * have no effect, if called at the wrong moment. + * + * @see ExecuteListener#prepareEnd(ExecuteContext) + * @see ExecuteListener#bindStart(ExecuteContext) */ void statement(PreparedStatement statement); - PreparedStatement statement(); - - // Nullable! - void resultSet(ResultSet resultSet); - + /** + * The {@link ResultSet} that is being fetched or null if the + * result set is unknown or if no result set is being fetched. + */ ResultSet resultSet(); - // Nullable - void record(Record record); + /** + * Override the {@link ResultSet} that is being fetched. This may have no + * effect, if called at the wrong moment. + * + * @see ExecuteListener#executeEnd(ExecuteContext) + * @see ExecuteListener#fetchStart(ExecuteContext) + */ + void resultSet(ResultSet resultSet); + /** + * The last record that was fetched from the result set, or + * null if no record has been fetched. + */ Record record(); - void result(Result result); + /** + * Calling this has no effect. It is being used by jOOQ internally. + */ + void record(Record record); + /** + * The last result that was fetched from the result set, or + * null if no result has been fetched. + */ Result result(); + /** + * Calling this has no effect. It is being used by jOOQ internally. + */ + void result(Result result); + } diff --git a/jOOQ/src/main/java/org/jooq/ExecuteListener.java b/jOOQ/src/main/java/org/jooq/ExecuteListener.java index c27961b3a4..3c07b0572c 100644 --- a/jOOQ/src/main/java/org/jooq/ExecuteListener.java +++ b/jOOQ/src/main/java/org/jooq/ExecuteListener.java @@ -40,62 +40,735 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import org.jooq.conf.Settings; +import org.jooq.conf.StatementType; import org.jooq.impl.DefaultExecuteListener; import org.jooq.impl.Factory; import org.jooq.tools.LoggerListener; import org.jooq.tools.StopWatchListener; /** - * An event listener for {@link Query} render, prepare, bind, execute, fetch - * steps. + * An event listener for {@link Query}, {@link Routine}, or {@link ResultSet} + * render, prepare, bind, execute, fetch steps. *

- * EventListener is a base type for loggers, debuggers, profilers, - * data collectors that can be hooked into a jOOQ {@link Factory} using the - * {@link Settings#getEventListeners()} property, passing Settings - * to {@link Factory#Factory(java.sql.Connection, SQLDialect, Settings)} + * ExecuteListener is a base type for loggers, debuggers, + * profilers, data collectors that can be hooked into a jOOQ {@link Factory} + * using the {@link Settings#getExecuteListeners()} property, passing + * Settings to + * {@link Factory#Factory(java.sql.Connection, SQLDialect, Settings)}. Advanced + * ExecuteListeners can also provide custom implementations of + * {@link Connection}, {@link PreparedStatement} and {@link ResultSet} to jOOQ + * in apropriate methods. For convenience, consider extending + * {@link DefaultExecuteListener} instead of implementing this interface. This + * will prevent compilation errors in future versions of jOOQ, when this + * interface might get new methods. *

- * Advanced EventListeners can also provide custom implementations - * of {@link Connection}, {@link PreparedStatement} and {@link ResultSet} to - * jOOQ in apropriate methods. + * The following table explains how every type of statement / operation invokes + * callback methods in the correct order for all registered + * ExecuteListeners. Find a legend below the table for the various + * use cases. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Callback methodUse case [1]Use case [2]Use case [3]Use case [4]
{@link #start(ExecuteContext)}YesYesYesYes
{@link #renderStart(ExecuteContext)}YesYesNoYes
{@link #renderEnd(ExecuteContext)}YesYesNoYes
{@link #prepareStart(ExecuteContext)}YesYesNoYes
{@link #prepareEnd(ExecuteContext)}YesYesNoYes
{@link #bindStart(ExecuteContext)}YesNoNoYes
{@link #bindEnd(ExecuteContext)}YesNoNoYes
{@link #executeStart(ExecuteContext)}YesYesNoYes
{@link #executeEnd(ExecuteContext)}YesYesNoYes
{@link #fetchStart(ExecuteContext)}YesYesYesNo
{@link #resultStart(ExecuteContext)}YesYesYesNo
{@link #recordStart(ExecuteContext)}
+ *
YesYesYesNo
{@link #recordEnd(ExecuteContext)}YesYesYesNo
{@link #resultEnd(ExecuteContext)}YesYesYesNo
{@link #fetchEnd(ExecuteContext)}YesYesYesNo
{@link #end(ExecuteContext)}YesYesYesNo
+ *
+ *

Legend:

+ *
    + *
  1. Used with {@link ResultQuery} of statement type + * {@link StatementType#PREPARED_STATEMENT}
  2. + *
  3. Used with {@link ResultQuery} of statement type + * {@link StatementType#STATIC_STATEMENT}
  4. + *
  5. Used with {@link Factory#fetch(ResultSet)} or with + * {@link InsertResultStep#fetch()}
  6. + *
  7. Used with a {@link Routine} standalone call
  8. + *
*

* If nothing is specified, the default is to use {@link LoggerListener} and * {@link StopWatchListener} as the only event listeners. - *

- * For convenience, consider extending {@link DefaultExecuteListener} instead of - * implementing this interface. This will prevent compilation errors in future - * versions of jOOQ, when this interface might get new methods. * * @author Lukas Eder */ public interface ExecuteListener { - void init(ExecuteContext ctx); + /** + * Called to initialise an ExecuteListener + *

+ * Available attributes from ExecuteContext: + *

+ */ + void start(ExecuteContext ctx); + /** + * Called before rendering SQL from a QueryPart + *

+ * Available attributes from ExecuteContext: + *

+ */ void renderStart(ExecuteContext ctx); + /** + * Called after rendering SQL from a QueryPart + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Overridable attributes in ExecuteContext: + *

+ */ void renderEnd(ExecuteContext ctx); + /** + * Called before preparing / creating the SQL statement + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Overridable attributes in ExecuteContext: + *

+ */ void prepareStart(ExecuteContext ctx); + /** + * Called after preparing / creating the SQL statement + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Overridable attributes in ExecuteContext: + *

+ */ void prepareEnd(ExecuteContext ctx); + /** + * Called before binding variables to the PreparedStatement + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Overridable attributes in ExecuteContext: + *

+ *

+ * Note that this method is not called when executing queries of type + * {@link StatementType#STATIC_STATEMENT} + */ void bindStart(ExecuteContext ctx); + /** + * Called after binding variables to the PreparedStatement + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Note that this method is not called when executing queries of type + * {@link StatementType#STATIC_STATEMENT} + */ void bindEnd(ExecuteContext ctx); + /** + * Called before executing a statement + *

+ * Available attributes from ExecuteContext: + *

+ */ void executeStart(ExecuteContext ctx); + /** + * Called after executing a statement + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Overridable attributes in ExecuteContext: + *

+ */ void executeEnd(ExecuteContext ctx); - void recordStart(ExecuteContext ctx); - - void recordEnd(ExecuteContext ctx); - - void resultStart(ExecuteContext ctx); - - void resultEnd(ExecuteContext ctx); - + /** + * Called before fetching data from a ResultSet. + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Overridable attributes in ExecuteContext: + *

+ *

+ * In case of multiple ResultSets with + * {@link ResultQuery#fetchMany()}, this is called several times, once per + * ResultSet + *

+ * Note that this method is not called when executing queries that do not + * return a result, or when executing routines. + */ void fetchStart(ExecuteContext ctx); + /** + * Called before fetching a set of records from a ResultSet + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Note that this method is not called when executing queries that do not + * return a result, or when executing routines. This is also not called when + * fetching single records, with {@link Cursor#fetchOne()} for instance. + */ + void resultStart(ExecuteContext ctx); + + /** + * Called before fetching a record from a ResultSet + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Note that this method is not called when executing queries that do not + * return a result, or when executing routines. + */ + void recordStart(ExecuteContext ctx); + + /** + * Called after fetching a record from a ResultSet + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Note that this method is not called when executing queries that do not + * return a result, or when executing routines. + */ + void recordEnd(ExecuteContext ctx); + + /** + * Called after fetching a set of records from a ResultSet + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * Note that this method is not called when executing queries that do not + * return a result, or when executing routines. This is also not called when + * fetching single records, with {@link Cursor#fetchOne()} for instance. + */ + void resultEnd(ExecuteContext ctx); + + /** + * Called after fetching data from a ResultSet. + *

+ * Available attributes from ExecuteContext: + *

+ *

+ * In case of multiple ResultSets with + * {@link ResultQuery#fetchMany()}, this is called several times, once per + * ResultSet + *

+ * Note that this method is not called when executing queries that do not + * return a result, or when executing routines. + */ void fetchEnd(ExecuteContext ctx); + + /** + * Called at the end of the execution lifecycle.. + *

+ * Available attributes from ExecuteContext: + *

+ */ + void end(ExecuteContext ctx); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java index a05f73f10e..b076dd8613 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java @@ -117,12 +117,12 @@ abstract class AbstractQuery extends AbstractQueryPart implements Query { throw new DetachedException("Cannot execute query. No Connection configured"); } - ExecuteListener listener = new ExecuteListeners(configuration); - ExecuteContext ctx = new DefaultExecuteContext(configuration, this); - // Ensure that all depending Attachables are attached attach(configuration); + ExecuteContext ctx = new DefaultExecuteContext(configuration, this); + ExecuteListener listener = new ExecuteListeners(ctx); + int result = 0; try { listener.renderStart(ctx); @@ -148,7 +148,7 @@ abstract class AbstractQuery extends AbstractQueryPart implements Query { } finally { if (!keepStatementOpen()) { - Util.safeClose(ctx); + Util.safeClose(listener, ctx); } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java index d542937117..fc4b9b7352 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java @@ -148,7 +148,6 @@ abstract class AbstractResultQuery extends AbstractQuery imple // Fetch a single result set if (!many) { - listener.fetchStart(ctx); FieldList fields = new FieldList(getFields(ctx.resultSet().getMetaData())); cursor = new CursorImpl(ctx, listener, fields, getRecordType()); @@ -163,7 +162,6 @@ abstract class AbstractResultQuery extends AbstractQuery imple results = new ArrayList>(); for (;;) { - listener.fetchStart(ctx); FieldProvider fields = new MetaDataFieldProvider(ctx, ctx.resultSet().getMetaData()); Cursor c = new CursorImpl(ctx, listener, fields); results.add(c.fetch()); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index 8852b84233..ea4fcbddee 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -242,8 +242,8 @@ public abstract class AbstractRoutine extends AbstractSchemaProviderQueryPart private final int executeCallableStatement() { Configuration configuration = attachable.getConfiguration(); - ExecuteListener listener = new ExecuteListeners(configuration); - ExecuteContext ctx = new DefaultExecuteContext(configuration, null); + ExecuteContext ctx = new DefaultExecuteContext(configuration, this); + ExecuteListener listener = new ExecuteListeners(ctx); try { Connection connection = configuration.getConnection(); @@ -283,7 +283,7 @@ public abstract class AbstractRoutine extends AbstractSchemaProviderQueryPart throw translate("AbstractRoutine.executeCallableStatement", ctx.sql(), e); } finally { - Util.safeClose(ctx); + Util.safeClose(listener, ctx); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java index d509dc2a64..5da99a2668 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java @@ -125,6 +125,7 @@ class CursorImpl implements Cursor { public final Iterator iterator() { if (iterator == null) { iterator = new CursorIterator(); + listener.fetchStart(ctx); } return iterator; @@ -236,9 +237,9 @@ class CursorImpl implements Cursor { @Override public final void close() throws SQLException { - listener.fetchEnd(ctx); ctx.resultSet().close(); ctx.statement().close(); + listener.fetchEnd(ctx); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java index b7f26d1e5d..d4cf79d410 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java @@ -43,6 +43,7 @@ import org.jooq.ExecuteContext; import org.jooq.Query; import org.jooq.Record; import org.jooq.Result; +import org.jooq.Routine; /** * A default iplementation for the {@link ExecuteContext} @@ -58,6 +59,7 @@ class DefaultExecuteContext extends AbstractConfiguration implements ExecuteCont // Persistent attributes private final Query query; + private final Routine routine; private String sql; // Transient attributes @@ -67,13 +69,22 @@ class DefaultExecuteContext extends AbstractConfiguration implements ExecuteCont private transient Result result; DefaultExecuteContext(Configuration configuration) { - this(configuration, null); + this(configuration, null, null); } DefaultExecuteContext(Configuration configuration, Query query) { + this(configuration, query, null); + } + + DefaultExecuteContext(Configuration configuration, Routine routine) { + this(configuration, null, routine); + } + + private DefaultExecuteContext(Configuration configuration, Query query, Routine routine) { super(configuration); this.query = query; + this.routine = routine; } @Override @@ -81,6 +92,11 @@ class DefaultExecuteContext extends AbstractConfiguration implements ExecuteCont return query; } + @Override + public final Routine routine() { + return routine; + } + @Override public final void sql(String s) { this.sql = s; diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteListener.java b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteListener.java index f611cd8bda..5871aa7066 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteListener.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteListener.java @@ -49,7 +49,7 @@ import org.jooq.ExecuteListener; public class DefaultExecuteListener implements ExecuteListener { @Override - public void init(ExecuteContext ctx) {} + public void start(ExecuteContext ctx) {} @Override public void renderStart(ExecuteContext ctx) {} @@ -75,22 +75,25 @@ public class DefaultExecuteListener implements ExecuteListener { @Override public void executeEnd(ExecuteContext ctx) {} + @Override + public void fetchStart(ExecuteContext ctx) {} + + @Override + public void resultStart(ExecuteContext ctx) {} + @Override public void recordStart(ExecuteContext ctx) {} @Override public void recordEnd(ExecuteContext ctx) {} - @Override - public void resultStart(ExecuteContext ctx) {} - @Override public void resultEnd(ExecuteContext ctx) {} - @Override - public void fetchStart(ExecuteContext ctx) {} - @Override public void fetchEnd(ExecuteContext ctx) {} + @Override + public void end(ExecuteContext ctx) {} + } diff --git a/jOOQ/src/main/java/org/jooq/impl/ExecuteListeners.java b/jOOQ/src/main/java/org/jooq/impl/ExecuteListeners.java index 0ee9379a6c..dd2fde3be4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ExecuteListeners.java +++ b/jOOQ/src/main/java/org/jooq/impl/ExecuteListeners.java @@ -37,7 +37,6 @@ package org.jooq.impl; import java.util.List; -import org.jooq.Configuration; import org.jooq.ExecuteContext; import org.jooq.ExecuteListener; import org.jooq.conf.Settings; @@ -52,13 +51,17 @@ class ExecuteListeners implements ExecuteListener { private final List listeners; - ExecuteListeners(Configuration configuration) { - listeners = Util.getListeners(configuration); + ExecuteListeners(ExecuteContext ctx) { + listeners = Util.getListeners(ctx); + + start(ctx); } @Override - public final void init(ExecuteContext ctx) { - throw new UnsupportedOperationException(); + public final void start(ExecuteContext ctx) { + for (ExecuteListener listener : listeners) { + listener.start(ctx); + } } @Override @@ -125,9 +128,9 @@ class ExecuteListeners implements ExecuteListener { } @Override - public final void fetchEnd(ExecuteContext ctx) { + public final void resultStart(ExecuteContext ctx) { for (ExecuteListener listener : listeners) { - listener.fetchEnd(ctx); + listener.resultStart(ctx); } } @@ -146,16 +149,23 @@ class ExecuteListeners implements ExecuteListener { } @Override - public void resultStart(ExecuteContext ctx) { - for (ExecuteListener listener : listeners) { - listener.resultStart(ctx); - } - } - - @Override - public void resultEnd(ExecuteContext ctx) { + public final void resultEnd(ExecuteContext ctx) { for (ExecuteListener listener : listeners) { listener.resultEnd(ctx); } } + + @Override + public final void fetchEnd(ExecuteContext ctx) { + for (ExecuteListener listener : listeners) { + listener.fetchEnd(ctx); + } + } + + @Override + public final void end(ExecuteContext ctx) { + for (ExecuteListener listener : listeners) { + listener.end(ctx); + } + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Factory.java b/jOOQ/src/main/java/org/jooq/impl/Factory.java index b8d9ef8aeb..ab034b98a5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Factory.java +++ b/jOOQ/src/main/java/org/jooq/impl/Factory.java @@ -966,14 +966,13 @@ public class Factory implements FactoryOperations { */ @Override public final Result fetch(ResultSet rs) { - ExecuteListener listener = new ExecuteListeners(this); - ExecuteContext ctx = new DefaultExecuteContext(this, null); + ExecuteContext ctx = new DefaultExecuteContext(this); + ExecuteListener listener = new ExecuteListeners(ctx); try { FieldProvider fields = new MetaDataFieldProvider(this, rs.getMetaData()); ctx.resultSet(rs); - listener.fetchStart(ctx); return new CursorImpl(ctx, listener, fields).fetch(); } catch (SQLException e) { diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index 428301f05b..e79d8ce5a7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -440,11 +440,10 @@ class InsertQueryImpl extends AbstractStoreQuery implements } } - ExecuteListener listener2 = new ExecuteListeners(ctx.configuration()); - ExecuteContext ctx2 = new DefaultExecuteContext(ctx.configuration(), null); + ExecuteContext ctx2 = new DefaultExecuteContext(ctx.configuration()); + ExecuteListener listener2 = new ExecuteListeners(ctx2); ctx2.resultSet(rs); - listener2.fetchStart(ctx2); returned = new CursorImpl(ctx2, listener2, returning, getInto().getRecordType()).fetch(); return result; } diff --git a/jOOQ/src/main/java/org/jooq/impl/Util.java b/jOOQ/src/main/java/org/jooq/impl/Util.java index d6e6fc91f3..6fc2f14444 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Util.java +++ b/jOOQ/src/main/java/org/jooq/impl/Util.java @@ -459,9 +459,10 @@ final class Util { /** * Safely close a statement */ - static final void safeClose(ExecuteContext ctx) { + static final void safeClose(ExecuteListener listener, ExecuteContext ctx) { safeClose(ctx.resultSet()); safeClose(ctx.statement()); + listener.end(ctx); } /** diff --git a/jOOQ/src/main/java/org/jooq/tools/StopWatchListener.java b/jOOQ/src/main/java/org/jooq/tools/StopWatchListener.java index 4511c89d76..2a496beede 100644 --- a/jOOQ/src/main/java/org/jooq/tools/StopWatchListener.java +++ b/jOOQ/src/main/java/org/jooq/tools/StopWatchListener.java @@ -49,7 +49,7 @@ public class StopWatchListener implements ExecuteListener { private final StopWatch watch = new StopWatch(); @Override - public void init(ExecuteContext ctx) { + public void start(ExecuteContext ctx) { watch.splitTrace("Initialising"); } @@ -99,8 +99,8 @@ public class StopWatchListener implements ExecuteListener { } @Override - public void fetchEnd(ExecuteContext ctx) { - watch.splitDebug("Results fetched"); + public void resultStart(ExecuteContext ctx) { + watch.splitTrace("Fetching result"); } @Override @@ -113,13 +113,18 @@ public class StopWatchListener implements ExecuteListener { watch.splitTrace("Record fetched"); } - @Override - public void resultStart(ExecuteContext ctx) { - watch.splitTrace("Fetching result"); - } - @Override public void resultEnd(ExecuteContext ctx) { watch.splitTrace("Result fetched"); } + + @Override + public void fetchEnd(ExecuteContext ctx) { + watch.splitTrace("Results fetched"); + } + + @Override + public void end(ExecuteContext ctx) { + watch.splitDebug("Finishing"); + } }