From b2a9d1fb5407dec865968ab78c49fb0a45e5e898 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Tue, 26 Jun 2018 15:19:00 +0200 Subject: [PATCH] [#7569] Regression in UpdatableRecord.store() and update() methods when used with connection pools --- .../java/org/jooq/impl/AbstractDMLQuery.java | 38 ++++++++++++++----- .../main/java/org/jooq/impl/CursorImpl.java | 6 +-- .../org/jooq/impl/DefaultExecuteContext.java | 17 +++++++-- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 84920ca5d7..22924f8b5b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -37,6 +37,7 @@ */ package org.jooq.impl; +// ... // ... // ... import static org.jooq.SQLDialect.HSQLDB; @@ -629,13 +630,14 @@ abstract class AbstractDMLQuery extends AbstractQuery { ctx.rows(result); listener.executeEnd(ctx); - DSLContext create = DSL.using(ctx.configuration()); + DSLContext create = ctx.dsl(); returnedResult = create.select(returning) .from(table) .where(rowid().equal(rowid().getDataType().convert(create.lastID()))) .fetch(); + returnedResult.attach(((DefaultExecuteContext) ctx).originalConfiguration()); return result; } @@ -655,7 +657,12 @@ abstract class AbstractDMLQuery extends AbstractQuery { ctx.rows(result); listener.executeEnd(ctx); - selectReturning(ctx.configuration(), ctx.dsl().lastID()); + selectReturning( + ((DefaultExecuteContext) ctx).originalConfiguration(), + ctx.configuration(), + ctx.dsl().lastID() + ); + return result; } @@ -691,7 +698,12 @@ abstract class AbstractDMLQuery extends AbstractQuery { while (rs.next()) list.add(rs.getObject(1)); - selectReturning(ctx.configuration(), list.toArray()); + selectReturning( + ((DefaultExecuteContext) ctx).originalConfiguration(), + ctx.configuration(), + list.toArray() + ); + return result; } finally { @@ -793,6 +805,7 @@ abstract class AbstractDMLQuery extends AbstractQuery { + case HSQLDB: @@ -830,7 +843,11 @@ abstract class AbstractDMLQuery extends AbstractQuery { * arbitrary fields from JDBC's {@link Statement#getGeneratedKeys()} method. */ @SuppressWarnings({ "unchecked", "rawtypes" }) - private final void selectReturning(Configuration configuration, Object... values) { + private final void selectReturning( + Configuration originalConfiguration, + Configuration derivedConfiguration, + Object... values + ) { if (values != null && values.length > 0) { // This shouldn't be null, as relevant dialects should @@ -846,7 +863,7 @@ abstract class AbstractDMLQuery extends AbstractQuery { if (returningResolvedAsterisks.size() == 1 && new Fields(returningResolvedAsterisks).field(field) != null) { for (final Object id : ids) { ((Result) getResult()).add( - Tools.newRecord(true, table, configuration) + Tools.newRecord(true, table, originalConfiguration) .operate(new RecordOperation() { @Override @@ -865,10 +882,13 @@ abstract class AbstractDMLQuery extends AbstractQuery { // Other values are requested, too. Run another query else { returnedResult = - configuration.dsl().select(returning) - .from(table) - .where(field.in(ids)) - .fetch(); + derivedConfiguration.dsl() + .select(returning) + .from(table) + .where(field.in(ids)) + .fetch(); + + returnedResult.attach(originalConfiguration); } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java index b5a75c5e40..2ea9c8b00b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CursorImpl.java @@ -399,7 +399,7 @@ final class CursorImpl extends AbstractCursor implements Cu // Before listener.resultStart(ctx) iterator(); - ResultImpl result = new ResultImpl(ctx.configuration(), cursorFields); + ResultImpl result = new ResultImpl(((DefaultExecuteContext) ctx).originalConfiguration(), cursorFields); ctx.result(result); listener.resultStart(ctx); @@ -1614,7 +1614,7 @@ final class CursorImpl extends AbstractCursor implements Cu rs.updateRow(); } - record = Tools.newRecord(true, (RecordFactory) factory, ctx.configuration()) + record = Tools.newRecord(true, (RecordFactory) factory, ((DefaultExecuteContext) ctx).originalConfiguration()) .operate(new CursorRecordInitialiser(cursorFields, 0)); rows++; @@ -1710,7 +1710,7 @@ final class CursorImpl extends AbstractCursor implements Cu if (field instanceof RowField) { Field[] emulatedFields = ((RowField) field).emulatedFields(); - value = (T) Tools.newRecord(true, RecordImpl.class, emulatedFields, ctx.configuration()) + value = (T) Tools.newRecord(true, RecordImpl.class, emulatedFields, ((DefaultExecuteContext) ctx).originalConfiguration()) .operate(new CursorRecordInitialiser(emulatedFields, offset + index)); offset += emulatedFields.length - 1; diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java index b446f3ba1a..c8f09487b9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java @@ -89,7 +89,8 @@ class DefaultExecuteContext implements ExecuteContext { private static final JooqLogger log = JooqLogger.getLogger(DefaultExecuteContext.class); // Persistent attributes (repeatable) - private final Configuration configuration; + private final Configuration originalConfiguration; + private final Configuration derivedConfiguration; private final Map data; private final Query query; private final Routine routine; @@ -468,8 +469,10 @@ class DefaultExecuteContext implements ExecuteContext { // [#4277] The ExecuteContext's Configuration will always return the same Connection, // e.g. when running statements from sub-ExecuteContexts + // [#7569] The original configuration is attached to Record and Result instances this.connectionProvider = configuration.connectionProvider(); - this.configuration = configuration.derive(new ExecuteContextConnectionProvider()); + this.originalConfiguration = configuration; + this.derivedConfiguration = configuration.derive(new ExecuteContextConnectionProvider()); this.data = new DataMap(); this.query = query; this.routine = routine; @@ -656,7 +659,13 @@ class DefaultExecuteContext implements ExecuteContext { @Override public final Configuration configuration() { - return configuration; + return derivedConfiguration; + } + + // [#4277] [#7569] The original configuration that was used to create the + // derived configuration in this ExecuteContext + final Configuration originalConfiguration() { + return originalConfiguration; } @Override @@ -712,7 +721,7 @@ class DefaultExecuteContext implements ExecuteContext { } private final SettingsEnabledConnection wrapConnection(ConnectionProvider provider, Connection c) { - return new SettingsEnabledConnection(new ProviderEnabledConnection(provider, c), configuration.settings()); + return new SettingsEnabledConnection(new ProviderEnabledConnection(provider, c), derivedConfiguration.settings()); } final void incrementStatementExecutionCount() {