[#7569] Regression in UpdatableRecord.store() and update() methods when used with connection pools

This commit is contained in:
lukaseder 2018-06-26 15:19:00 +02:00
parent dc59407451
commit b2a9d1fb54
3 changed files with 45 additions and 16 deletions

View File

@ -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);
}
}
}

View File

@ -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;

View File

@ -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() {