Skip to content

Commit 0ffd41b

Browse files
committed
HHH-19477 Add missing JdbcCoordinator#afterStatement calls to enable aggressive connection release
1 parent ed760b8 commit 0ffd41b

File tree

12 files changed

+105
-73
lines changed

12 files changed

+105
-73
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTableHelper.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.function.Function;
1515

1616
import org.hibernate.engine.jdbc.internal.FormatStyle;
17+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1718
import org.hibernate.engine.jdbc.spi.JdbcServices;
1819
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
1920
import org.hibernate.engine.jdbc.spi.SqlStatementLogger;
@@ -149,30 +150,32 @@ public static void cleanTemporaryTableRows(
149150
TemporaryTableExporter exporter,
150151
Function<SharedSessionContractImplementor,String> sessionUidAccess,
151152
SharedSessionContractImplementor session) {
153+
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
152154
PreparedStatement ps = null;
153155
try {
154156
final String sql = exporter.getSqlTruncateCommand( temporaryTable, sessionUidAccess, session );
155157

156-
ps = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql, false );
158+
ps = jdbcCoordinator.getStatementPreparer().prepareStatement( sql, false );
157159

158160
if ( temporaryTable.getSessionUidColumn() != null ) {
159161
final String sessionUid = sessionUidAccess.apply( session );
160162
ps.setString( 1, sessionUid );
161163
}
162164

163-
session.getJdbcCoordinator().getResultSetReturn().executeUpdate( ps, sql );
165+
jdbcCoordinator.getResultSetReturn().executeUpdate( ps, sql );
164166
}
165167
catch( Throwable t ) {
166168
log.unableToCleanupTemporaryIdTable(t);
167169
}
168170
finally {
169171
if ( ps != null ) {
170172
try {
171-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( ps );
173+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( ps );
172174
}
173175
catch( Throwable ignore ) {
174176
// ignore
175177
}
178+
jdbcCoordinator.afterStatementExecution();
176179
}
177180
}
178181
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsert.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public class MutationExecutorPostInsert implements MutationExecutor, JdbcValueBi
5151
protected final EntityMutationTarget mutationTarget;
5252
protected final MutationOperationGroup mutationOperationGroup;
5353

54+
protected final SharedSessionContractImplementor session;
5455
protected final PreparedStatementDetails identityInsertStatementDetails;
5556

5657
/**
@@ -69,6 +70,7 @@ public MutationExecutorPostInsert(EntityMutationOperationGroup mutationOperation
6970
session
7071
);
7172
this.mutationOperationGroup = mutationOperationGroup;
73+
this.session = session;
7274

7375
final PreparableMutationOperation identityInsertOperation = (PreparableMutationOperation) mutationOperationGroup.getOperation( mutationTarget.getIdentifierTableName() );
7476
this.identityInsertStatementDetails = ModelMutationHelper.identityPreparation(
@@ -223,6 +225,7 @@ private void executeWithId(
223225

224226
@Override
225227
public void release() {
228+
identityInsertStatementDetails.releaseStatement( session );
226229
secondaryTablesStatementGroup.release();
227230
}
228231

hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorStandard.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ public PreparedStatementDetails getPreparedStatementDetails(String tableName) {
197197

198198
@Override
199199
public void release() {
200-
nonBatchedStatementGroup.release();
200+
// nothing to do - `#performNonBatchedMutation` already releases the statement
201201
}
202202

203203
@Override

hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/PreparedStatementDetailsStandard.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails;
1414
import org.hibernate.engine.jdbc.mutation.group.PreparedStatementGroup;
15+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1516
import org.hibernate.engine.jdbc.spi.JdbcServices;
1617
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1718
import org.hibernate.jdbc.Expectation;
@@ -66,8 +67,10 @@ public TableMapping getMutatingTableDetails() {
6667
@Override
6768
public void releaseStatement(SharedSessionContractImplementor session) {
6869
if ( statement != null ) {
69-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( statement );
70+
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
71+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( statement );
7072
statement = null;
73+
jdbcCoordinator.afterStatementExecution();
7174
}
7275
}
7376

hibernate-core/src/main/java/org/hibernate/id/insert/GetGeneratedKeysDelegate.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ public Object performInsert(
133133
}
134134
finally {
135135
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( insertStatement );
136+
jdbcCoordinator.afterStatementExecution();
136137
}
137138
}
138139
catch (SQLException e) {

hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -285,38 +285,41 @@ protected void doStaticDelete(
285285

286286
final MutationExecutor mutationExecutor = executor( session, operationGroupToUse );
287287

288-
for ( int position = 0; position < staticOperationGroup.getNumberOfOperations(); position++ ) {
289-
final MutationOperation mutation = staticOperationGroup.getOperation( position );
290-
if ( mutation != null ) {
291-
mutationExecutor.getPreparedStatementDetails( mutation.getTableDetails().getTableName() );
288+
try {
289+
for ( int position = 0; position < staticOperationGroup.getNumberOfOperations(); position++ ) {
290+
final MutationOperation mutation = staticOperationGroup.getOperation( position );
291+
if ( mutation != null ) {
292+
mutationExecutor.getPreparedStatementDetails( mutation.getTableDetails().getTableName() );
293+
}
292294
}
293-
}
294295

295-
if ( applyVersion ) {
296-
applyLocking( version, null, mutationExecutor, session );
297-
}
298-
final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings();
296+
if ( applyVersion ) {
297+
applyLocking( version, null, mutationExecutor, session );
298+
}
299+
final JdbcValueBindings jdbcValueBindings = mutationExecutor.getJdbcValueBindings();
300+
301+
bindPartitionColumnValueBindings( loadedState, session, jdbcValueBindings );
299302

300-
bindPartitionColumnValueBindings( loadedState, session, jdbcValueBindings );
301-
302-
applyId( id, null, mutationExecutor, staticOperationGroup, session );
303-
304-
mutationExecutor.execute(
305-
entity,
306-
null,
307-
null,
308-
(statementDetails, affectedRowCount, batchPosition) -> identifiedResultsCheck(
309-
statementDetails,
310-
affectedRowCount,
311-
batchPosition,
312-
entityPersister(),
313-
id,
314-
factory()
315-
),
316-
session
317-
);
318-
319-
mutationExecutor.release();
303+
applyId( id, null, mutationExecutor, staticOperationGroup, session );
304+
305+
mutationExecutor.execute(
306+
entity,
307+
null,
308+
null,
309+
(statementDetails, affectedRowCount, batchPosition) -> identifiedResultsCheck(
310+
statementDetails,
311+
affectedRowCount,
312+
batchPosition,
313+
entityPersister(),
314+
id,
315+
factory()
316+
),
317+
session
318+
);
319+
}
320+
finally {
321+
mutationExecutor.release();
322+
}
320323
}
321324

322325
protected MutationOperationGroup resolveNoVersionDeleteGroup(SharedSessionContractImplementor session) {

hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,7 @@ private ProcedureOutputsImpl buildOutputs() {
697697
}
698698
catch (SQLException e) {
699699
getSession().getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( statement );
700+
getSession().getJdbcCoordinator().afterStatementExecution();
700701
throw getSession().getJdbcServices().getSqlExceptionHelper().convert(
701702
e,
702703
"Error registering CallableStatement parameters",

hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureOutputsImpl.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,4 @@ protected Output buildFunctionReturn() {
146146
return buildResultSetOutput( () -> results );
147147
}
148148
}
149-
150-
@Override
151-
public void release() {
152-
super.release();
153-
getResultContext().getSession().getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( callableStatement );
154-
}
155149
}

hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.function.Supplier;
1717

1818
import org.hibernate.JDBCException;
19+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1920
import org.hibernate.engine.spi.SessionFactoryImplementor;
2021
import org.hibernate.internal.CoreLogging;
2122
import org.hibernate.procedure.internal.ProcedureCallImpl;
@@ -131,7 +132,9 @@ public boolean goToNext() {
131132

132133
@Override
133134
public void release() {
134-
context.getSession().getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( jdbcStatement );
135+
final JdbcCoordinator jdbcCoordinator = context.getSession().getJdbcCoordinator();
136+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( jdbcStatement );
137+
jdbcCoordinator.afterStatementExecution();
135138
}
136139

137140
private List<?> extractCurrentResults() {

hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/DeleteOrUpsertOperation.java

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -115,19 +115,25 @@ private void performDelete(JdbcValueBindings jdbcValueBindings, SharedSessionCon
115115

116116
final PreparedStatementGroupSingleTable statementGroup = new PreparedStatementGroupSingleTable( upsertDelete, session );
117117
final PreparedStatementDetails statementDetails = statementGroup.resolvePreparedStatementDetails( tableMapping.getTableName() );
118-
final PreparedStatement upsertDeleteStatement = statementDetails.resolveStatement();
119-
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
120-
121-
bindDeleteKeyValues(
122-
jdbcValueBindings,
123-
optionalTableUpdate.getParameters(),
124-
statementDetails,
125-
session
126-
);
127118

128-
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
129-
.executeUpdate( upsertDeleteStatement, statementDetails.getSqlString() );
130-
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upsert-deleted from `%s`", rowCount, tableMapping.getTableName() );
119+
try {
120+
final PreparedStatement upsertDeleteStatement = statementDetails.resolveStatement();
121+
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
122+
123+
bindDeleteKeyValues(
124+
jdbcValueBindings,
125+
optionalTableUpdate.getParameters(),
126+
statementDetails,
127+
session
128+
);
129+
130+
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
131+
.executeUpdate( upsertDeleteStatement, statementDetails.getSqlString() );
132+
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upsert-deleted from `%s`", rowCount, tableMapping.getTableName() );
133+
}
134+
finally {
135+
statementDetails.releaseStatement( session );
136+
}
131137
}
132138

133139
private void bindDeleteKeyValues(
@@ -189,14 +195,19 @@ private void performUpsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon
189195
final PreparedStatementGroupSingleTable statementGroup = new PreparedStatementGroupSingleTable( upsertOperation, session );
190196
final PreparedStatementDetails statementDetails = statementGroup.resolvePreparedStatementDetails( tableMapping.getTableName() );
191197

192-
final PreparedStatement updateStatement = statementDetails.resolveStatement();
193-
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
198+
try {
199+
final PreparedStatement updateStatement = statementDetails.resolveStatement();
200+
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
194201

195-
jdbcValueBindings.beforeStatement( statementDetails );
202+
jdbcValueBindings.beforeStatement( statementDetails );
196203

197-
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
198-
.executeUpdate( updateStatement, statementDetails.getSqlString() );
204+
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
205+
.executeUpdate( updateStatement, statementDetails.getSqlString() );
199206

200-
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upserted into `%s`", rowCount, tableMapping.getTableName() );
207+
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upserted into `%s`", rowCount, tableMapping.getTableName() );
208+
}
209+
finally {
210+
statementDetails.releaseStatement( session );
211+
}
201212
}
202213
}

hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,20 @@ public void performMutation(
171171
private void performDelete(JdbcValueBindings jdbcValueBindings, SharedSessionContractImplementor session) {
172172
final JdbcDeleteMutation jdbcDelete = createJdbcDelete( session );
173173

174-
final PreparedStatement deleteStatement = createStatementDetails( jdbcDelete, session );
174+
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
175+
final PreparedStatement deleteStatement = createStatementDetails( jdbcDelete, jdbcCoordinator );
175176
session.getJdbcServices().getSqlStatementLogger().logStatement( jdbcDelete.getSqlString() );
176177

177178
bindKeyValues( jdbcValueBindings, deleteStatement, jdbcDelete, session );
178179

179-
session.getJdbcCoordinator().getResultSetReturn()
180-
.executeUpdate( deleteStatement, jdbcDelete.getSqlString() );
180+
try {
181+
session.getJdbcCoordinator().getResultSetReturn()
182+
.executeUpdate( deleteStatement, jdbcDelete.getSqlString() );
183+
}
184+
finally {
185+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( deleteStatement );
186+
jdbcCoordinator.afterStatementExecution();
187+
}
181188
}
182189

183190
private void bindKeyValues(
@@ -373,12 +380,16 @@ private boolean performUpdate(
373380
statementDetails.getSqlString()
374381
);
375382
}
383+
finally {
384+
statementDetails.releaseStatement( session );
385+
}
376386
}
377387

378388
private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionContractImplementor session) {
379389
final JdbcInsertMutation jdbcInsert = createJdbcInsert( session );
380390

381-
final PreparedStatement insertStatement = createStatementDetails( jdbcInsert, session );
391+
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
392+
final PreparedStatement insertStatement = createStatementDetails( jdbcInsert, jdbcCoordinator );
382393

383394
try {
384395
session.getJdbcServices().getSqlStatementLogger().logStatement( jdbcInsert.getSqlString() );
@@ -404,11 +415,12 @@ private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon
404415
} );
405416
}
406417

407-
session.getJdbcCoordinator().getResultSetReturn()
418+
jdbcCoordinator.getResultSetReturn()
408419
.executeUpdate( insertStatement, jdbcInsert.getSqlString() );
409420
}
410421
finally {
411-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( insertStatement );
422+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( insertStatement );
423+
jdbcCoordinator.afterStatementExecution();
412424
}
413425
}
414426

@@ -449,11 +461,10 @@ private JdbcInsertMutation createJdbcInsert(SharedSessionContractImplementor ses
449461

450462
private static PreparedStatement createStatementDetails(
451463
PreparableMutationOperation operation,
452-
SharedSessionContractImplementor session) {
453-
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
464+
JdbcCoordinator jdbcCoordinator) {
454465
final MutationStatementPreparer statementPreparer = jdbcCoordinator.getMutationStatementPreparer();
455466
final PreparedStatement statement = statementPreparer.prepareStatement( operation.getSqlString(), false );
456-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().register( null, statement );
467+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().register( null, statement );
457468
return statement;
458469
}
459470

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/DeferredResultSetAccess.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hibernate.dialect.Dialect;
1818
import org.hibernate.dialect.pagination.LimitHandler;
1919
import org.hibernate.dialect.pagination.NoopLimitHandler;
20+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
2021
import org.hibernate.engine.jdbc.spi.SqlStatementLogger;
2122
import org.hibernate.engine.spi.SessionEventListenerManager;
2223
import org.hibernate.engine.spi.SessionFactoryImplementor;
@@ -259,9 +260,6 @@ private void executeQuery() {
259260
"JDBC exception executing SQL [" + finalSql + "]"
260261
);
261262
}
262-
finally {
263-
logicalConnection.afterStatement();
264-
}
265263
}
266264

267265
protected void skipRows(ResultSet resultSet) throws SQLException {
@@ -321,11 +319,12 @@ public void release() {
321319
}
322320

323321
if ( preparedStatement != null ) {
324-
getPersistenceContext().getJdbcCoordinator()
325-
.getLogicalConnection()
322+
final JdbcCoordinator jdbcCoordinator = getPersistenceContext().getJdbcCoordinator();
323+
jdbcCoordinator.getLogicalConnection()
326324
.getResourceRegistry()
327325
.release( preparedStatement );
328326
preparedStatement = null;
327+
jdbcCoordinator.afterStatementExecution();
329328
}
330329
}
331330
}

0 commit comments

Comments
 (0)