HHH-17887 Release mode After Statment with deferred result set access does not work

This commit is contained in:
Andrea Boriero 2024-04-04 17:56:21 +02:00 committed by Andrea Boriero
parent 189de9dab7
commit e95eaf6cb3
2 changed files with 69 additions and 70 deletions

View File

@ -182,74 +182,79 @@ public class OutputsImpl implements Outputs {
executionContext executionContext
); );
//noinspection unchecked
final RowReader<Object> rowReader = (RowReader<Object>) ResultsHelper.createRowReader(
executionContext,
null,
RowTransformerStandardImpl.INSTANCE,
null,
jdbcValues
);
/*
* Processing options effectively are only used for entity loading. Here we don't need these values.
*/
final JdbcValuesSourceProcessingOptions processingOptions = new JdbcValuesSourceProcessingOptions() {
@Override
public Object getEffectiveOptionalObject() {
return null;
}
@Override
public String getEffectiveOptionalEntityName() {
return null;
}
@Override
public Serializable getEffectiveOptionalId() {
return null;
}
@Override
public boolean shouldReturnProxies() {
return true;
}
};
final JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState =
new JdbcValuesSourceProcessingStateStandardImpl(
executionContext,
processingOptions
);
final ArrayList<Object> results = new ArrayList<>();
try { try {
final RowProcessingStateStandardImpl rowProcessingState = new RowProcessingStateStandardImpl(
jdbcValuesSourceProcessingState, //noinspection unchecked
final RowReader<Object> rowReader = (RowReader<Object>) ResultsHelper.createRowReader(
executionContext, executionContext,
rowReader, null,
RowTransformerStandardImpl.INSTANCE,
null,
jdbcValues jdbcValues
); );
rowReader.getInitializersList().startLoading( rowProcessingState ); /*
* Processing options effectively are only used for entity loading. Here we don't need these values.
*/
final JdbcValuesSourceProcessingOptions processingOptions = new JdbcValuesSourceProcessingOptions() {
@Override
public Object getEffectiveOptionalObject() {
return null;
}
while ( rowProcessingState.next() ) { @Override
results.add( rowReader.readRow( rowProcessingState, processingOptions ) ); public String getEffectiveOptionalEntityName() {
rowProcessingState.finishRowProcessing( true ); return null;
}
@Override
public Serializable getEffectiveOptionalId() {
return null;
}
@Override
public boolean shouldReturnProxies() {
return true;
}
};
final JdbcValuesSourceProcessingStateStandardImpl jdbcValuesSourceProcessingState =
new JdbcValuesSourceProcessingStateStandardImpl(
executionContext,
processingOptions
);
final ArrayList<Object> results = new ArrayList<>();
try {
final RowProcessingStateStandardImpl rowProcessingState = new RowProcessingStateStandardImpl(
jdbcValuesSourceProcessingState,
executionContext,
rowReader,
jdbcValues
);
rowReader.getInitializersList().startLoading( rowProcessingState );
while ( rowProcessingState.next() ) {
results.add( rowReader.readRow( rowProcessingState, processingOptions ) );
rowProcessingState.finishRowProcessing( true );
}
if ( resultSetMapping.getNumberOfResultBuilders() == 0
&& procedureCall.isFunctionCall()
&& procedureCall.getFunctionReturn().getJdbcTypeCode() == Types.REF_CURSOR
&& results.size() == 1
&& results.get( 0 ) instanceof ResultSet ) {
// When calling a function that returns a ref_cursor with as table function,
// we have to unnest the ResultSet manually here
return extractResults( (ResultSet) results.get( 0 ) );
}
return results;
} }
if ( resultSetMapping.getNumberOfResultBuilders() == 0 finally {
&& procedureCall.isFunctionCall() rowReader.finishUp( jdbcValuesSourceProcessingState );
&& procedureCall.getFunctionReturn().getJdbcTypeCode() == Types.REF_CURSOR jdbcValuesSourceProcessingState.finishUp( results.size() > 1 );
&& results.size() == 1
&& results.get( 0 ) instanceof ResultSet ) {
// When calling a function that returns a ref_cursor with as table function,
// we have to unnest the ResultSet manually here
return extractResults( (ResultSet) results.get( 0 ) );
} }
return results;
} }
finally { finally {
rowReader.finishUp( jdbcValuesSourceProcessingState );
jdbcValuesSourceProcessingState.finishUp( results.size() > 1 );
jdbcValues.finishUp( this.context.getSession() ); jdbcValues.finishUp( this.context.getSession() );
} }
} }

View File

@ -253,7 +253,6 @@ public class DeferredResultSetAccess extends AbstractResultSetAccess {
skipRows( resultSet ); skipRows( resultSet );
logicalConnection.getResourceRegistry().register( resultSet, preparedStatement ); logicalConnection.getResourceRegistry().register( resultSet, preparedStatement );
} }
catch (SQLException e) { catch (SQLException e) {
try { try {
@ -267,9 +266,6 @@ public class DeferredResultSetAccess extends AbstractResultSetAccess {
"JDBC exception executing SQL [" + finalSql + "]" "JDBC exception executing SQL [" + finalSql + "]"
); );
} }
finally {
logicalConnection.afterStatement();
}
} }
private JdbcSessionContext context() { private JdbcSessionContext context() {
@ -324,20 +320,18 @@ public class DeferredResultSetAccess extends AbstractResultSetAccess {
@Override @Override
public void release() { public void release() {
final LogicalConnectionImplementor logicalConnection = getPersistenceContext().getJdbcCoordinator()
.getLogicalConnection();
if ( resultSet != null ) { if ( resultSet != null ) {
getPersistenceContext().getJdbcCoordinator() logicalConnection.getResourceRegistry().release( resultSet, preparedStatement );
.getLogicalConnection()
.getResourceRegistry()
.release( resultSet, preparedStatement );
resultSet = null; resultSet = null;
} }
if ( preparedStatement != null ) { if ( preparedStatement != null ) {
getPersistenceContext().getJdbcCoordinator() logicalConnection.getResourceRegistry().release( preparedStatement );
.getLogicalConnection()
.getResourceRegistry()
.release( preparedStatement );
preparedStatement = null; preparedStatement = null;
} }
logicalConnection.afterStatement();
} }
} }