diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java index 8387f0fcc2..63d9cfe9b8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractQuery.java @@ -64,6 +64,7 @@ import static org.jooq.impl.Tools.consumeExceptions; import static org.jooq.impl.Tools.BooleanDataKey.DATA_COUNT_BIND_VALUES; import static org.jooq.impl.Tools.BooleanDataKey.DATA_FORCE_STATIC_STATEMENT; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -304,19 +305,7 @@ abstract class AbstractQuery extends AbstractAttachableQueryPa listener.renderEnd(ctx); rendered.sql = ctx.sql(); - // [#3234] Defer initialising of a connection until the prepare step - // This optimises unnecessary ConnectionProvider.acquire() calls when - // ControlFlowSignals are thrown - if (ctx.connection() == null) - if (ctx.configuration().connectionFactory() instanceof NoConnectionFactory) - throw new DetachedException("Cannot execute query. No JDBC Connection configured"); - else - throw new DetachedException( - "Attempt to execute a blocking method (e.g. Query.execute() or ResultQuery.fetch()) " - + "when only an R2BDC ConnectionFactory was configured. jOOQ's RowCountQuery and ResultQuery " - + "extend Publisher, which allows for reactive streams implementations to subscribe to the " - + "results of a jOOQ query. Simply embed your query in the stream, e.g. using Flux.from(query). " - + "See also: https://www.jooq.org/doc/latest/manual/sql-execution/fetching/reactive-fetching/"); + connection(ctx); // [#7106] In some SQL dialects, starting a transaction requires JDBC interaction if (this instanceof StartTransaction && SET_AUTOCOMMIT_ON_START_TRANSACTION.contains(ctx.dialect())) @@ -395,6 +384,26 @@ abstract class AbstractQuery extends AbstractAttachableQueryPa } } + static final Connection connection(DefaultExecuteContext ctx) { + Connection result = ctx.connection(); + + // [#3234] Defer initialising of a connection until the prepare step + // This optimises unnecessary ConnectionProvider.acquire() calls when + // ControlFlowSignals are thrown + if (result == null) + if (ctx.configuration().connectionFactory() instanceof NoConnectionFactory) + throw new DetachedException("Cannot execute query. No JDBC Connection configured"); + else + throw new DetachedException( + "Attempt to execute a blocking method (e.g. Query.execute() or ResultQuery.fetch()) " + + "when only an R2BDC ConnectionFactory was configured. jOOQ's RowCountQuery and ResultQuery " + + "extend Publisher, which allows for reactive streams implementations to subscribe to the " + + "results of a jOOQ query. Simply embed your query in the stream, e.g. using Flux.from(query). " + + "See also: https://www.jooq.org/doc/latest/manual/sql-execution/fetching/reactive-fetching/"); + else + return result; + } + @Override public final CompletionStage executeAsync() { return executeAsync(Tools.configuration(this).executorProvider().provide()); diff --git a/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java b/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java index 2ff8d4b4d2..a09bdf04eb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java +++ b/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java @@ -37,6 +37,8 @@ */ package org.jooq.impl; +import static org.jooq.impl.AbstractQuery.connection; + import java.sql.SQLException; import java.util.Arrays; import java.util.stream.IntStream; @@ -111,7 +113,7 @@ final class BatchMultiple extends AbstractBatch { ctx.transformQueries(listener); if (ctx.statement() == null) - ctx.statement(new SettingsEnabledPreparedStatement(ctx.connection())); + ctx.statement(new SettingsEnabledPreparedStatement(connection(ctx))); // [#9295] use query timeout from settings int t = SettingsTools.getQueryTimeout(0, ctx.settings()); diff --git a/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java b/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java index 7cd8e34eb9..ccaa234ae4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java +++ b/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java @@ -40,6 +40,7 @@ package org.jooq.impl; import static org.jooq.conf.ParamType.INLINED; import static org.jooq.conf.SettingsTools.executeStaticStatements; import static org.jooq.conf.SettingsTools.getBatchSize; +import static org.jooq.impl.AbstractQuery.connection; import static org.jooq.impl.Tools.checkedFunction; import static org.jooq.impl.Tools.chunks; import static org.jooq.impl.Tools.fields; @@ -208,7 +209,7 @@ final class BatchSingle extends AbstractBatch implements BatchBindStep { listener.prepareStart(ctx); if (ctx.statement() == null) - ctx.statement(ctx.connection().prepareStatement(ctx.sql())); + ctx.statement(connection(ctx).prepareStatement(ctx.sql())); listener.prepareEnd(ctx); // [#9295] use query timeout from settings