[#7569] Regression in UpdatableRecord.store() and update() methods when used with connection pools
This commit is contained in:
parent
dc59407451
commit
b2a9d1fb54
@ -37,6 +37,7 @@
|
||||
*/
|
||||
package org.jooq.impl;
|
||||
|
||||
// ...
|
||||
// ...
|
||||
// ...
|
||||
import static org.jooq.SQLDialect.HSQLDB;
|
||||
@ -629,13 +630,14 @@ abstract class AbstractDMLQuery<R extends Record> 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<R extends Record> 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<R extends Record> 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<R extends Record> extends AbstractQuery {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
case HSQLDB:
|
||||
@ -830,7 +843,11 @@ abstract class AbstractDMLQuery<R extends Record> 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<R extends Record> extends AbstractQuery {
|
||||
if (returningResolvedAsterisks.size() == 1 && new Fields<Record>(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<R, RuntimeException>() {
|
||||
|
||||
@Override
|
||||
@ -865,10 +882,13 @@ abstract class AbstractDMLQuery<R extends Record> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -399,7 +399,7 @@ final class CursorImpl<R extends Record> extends AbstractCursor<R> implements Cu
|
||||
// Before listener.resultStart(ctx)
|
||||
iterator();
|
||||
|
||||
ResultImpl<R> result = new ResultImpl<R>(ctx.configuration(), cursorFields);
|
||||
ResultImpl<R> result = new ResultImpl<R>(((DefaultExecuteContext) ctx).originalConfiguration(), cursorFields);
|
||||
|
||||
ctx.result(result);
|
||||
listener.resultStart(ctx);
|
||||
@ -1614,7 +1614,7 @@ final class CursorImpl<R extends Record> extends AbstractCursor<R> implements Cu
|
||||
rs.updateRow();
|
||||
}
|
||||
|
||||
record = Tools.newRecord(true, (RecordFactory<AbstractRecord>) factory, ctx.configuration())
|
||||
record = Tools.newRecord(true, (RecordFactory<AbstractRecord>) factory, ((DefaultExecuteContext) ctx).originalConfiguration())
|
||||
.operate(new CursorRecordInitialiser(cursorFields, 0));
|
||||
|
||||
rows++;
|
||||
@ -1710,7 +1710,7 @@ final class CursorImpl<R extends Record> extends AbstractCursor<R> 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;
|
||||
|
||||
@ -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<Object, Object> 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() {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user