Skip to content

Commit 83a88f6

Browse files
committed
HHH-19477 Add missing JdbcCoordinator#afterStatement calls to enable aggressive connection release
1 parent 8133698 commit 83a88f6

File tree

11 files changed

+83
-55
lines changed

11 files changed

+83
-55
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
@@ -12,6 +12,7 @@
1212
import java.util.function.Function;
1313

1414
import org.hibernate.engine.jdbc.internal.FormatStyle;
15+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1516
import org.hibernate.engine.jdbc.spi.JdbcServices;
1617
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
1718
import org.hibernate.engine.jdbc.spi.SqlStatementLogger;
@@ -147,27 +148,29 @@ public static void cleanTemporaryTableRows(
147148
TemporaryTableExporter exporter,
148149
Function<SharedSessionContractImplementor,String> sessionUidAccess,
149150
SharedSessionContractImplementor session) {
151+
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
150152
PreparedStatement preparedStatement = null;
151153
try {
152154
final String sql = exporter.getSqlTruncateCommand( temporaryTable, sessionUidAccess, session );
153-
preparedStatement = session.getJdbcCoordinator().getStatementPreparer().prepareStatement( sql );
155+
preparedStatement = jdbcCoordinator.getStatementPreparer().prepareStatement( sql );
154156
if ( temporaryTable.getSessionUidColumn() != null ) {
155157
final String sessionUid = sessionUidAccess.apply( session );
156158
preparedStatement.setString( 1, sessionUid );
157159
}
158-
session.getJdbcCoordinator().getResultSetReturn().executeUpdate( preparedStatement, sql );
160+
jdbcCoordinator.getResultSetReturn().executeUpdate( preparedStatement, sql );
159161
}
160162
catch( Throwable t ) {
161163
log.unableToCleanupTemporaryIdTable(t);
162164
}
163165
finally {
164166
if ( preparedStatement != null ) {
165167
try {
166-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( preparedStatement );
168+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( preparedStatement );
167169
}
168170
catch( Throwable ignore ) {
169171
// ignore
170172
}
173+
jdbcCoordinator.afterStatementExecution();
171174
}
172175
}
173176
}

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
@@ -10,6 +10,7 @@
1010

1111
import org.hibernate.engine.jdbc.mutation.group.PreparedStatementDetails;
1212
import org.hibernate.engine.jdbc.mutation.group.PreparedStatementGroup;
13+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1314
import org.hibernate.engine.jdbc.spi.JdbcServices;
1415
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1516
import org.hibernate.jdbc.Expectation;
@@ -66,9 +67,11 @@ 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;
7173
toRelease = false;
74+
jdbcCoordinator.afterStatementExecution();
7275
}
7376
}
7477

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ public GeneratedValues performMutation(
8686
statementDetails.releaseStatement( session );
8787
}
8888
jdbcValueBindings.afterStatement( statementDetails.getMutatingTableDetails() );
89-
session.getJdbcCoordinator().afterStatementExecution();
9089
}
9190

9291
// the insert is complete, select the generated id...

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@ public GeneratedValues performMutation(
141141
statementDetails.releaseStatement( session );
142142
}
143143
jdbcValueBindings.afterStatement( statementDetails.getMutatingTableDetails() );
144-
jdbcCoordinator.afterStatementExecution();
145144
}
146145
}
147146

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

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -273,17 +273,20 @@ protected void doStaticDelete(
273273
session
274274
);
275275

276-
mutationExecutor.execute(
277-
entity,
278-
null,
279-
null,
280-
(statementDetails, affectedRowCount, batchPosition) ->
281-
resultCheck( id, statementDetails, affectedRowCount, batchPosition ),
282-
session,
283-
staleStateException -> staleObjectState( id, staleStateException )
284-
);
285-
286-
mutationExecutor.release();
276+
try {
277+
mutationExecutor.execute(
278+
entity,
279+
null,
280+
null,
281+
(statementDetails, affectedRowCount, batchPosition) ->
282+
resultCheck( id, statementDetails, affectedRowCount, batchPosition ),
283+
session,
284+
staleStateException -> staleObjectState( id, staleStateException )
285+
);
286+
}
287+
finally {
288+
mutationExecutor.release();
289+
}
287290
}
288291

289292
private StaleObjectStateException staleObjectState(Object id, StaleStateException staleStateException) {

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
@@ -672,6 +672,7 @@ private ProcedureOutputsImpl buildOutputs() {
672672
}
673673
catch (SQLException e) {
674674
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( statement );
675+
getSession().getJdbcCoordinator().afterStatementExecution();
675676
throw jdbcServices.getSqlExceptionHelper().convert(
676677
e,
677678
"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
@@ -145,10 +145,4 @@ protected Output buildFunctionReturn() {
145145
return buildResultSetOutput( () -> results );
146146
}
147147
}
148-
149-
@Override
150-
public void release() {
151-
super.release();
152-
getResultContext().getSession().getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( callableStatement );
153-
}
154148
}

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
@@ -14,6 +14,7 @@
1414
import java.util.function.Supplier;
1515

1616
import org.hibernate.JDBCException;
17+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1718
import org.hibernate.engine.jdbc.spi.SqlStatementLogger;
1819
import org.hibernate.engine.spi.SessionFactoryImplementor;
1920
import org.hibernate.event.monitor.spi.EventMonitor;
@@ -135,7 +136,9 @@ public boolean goToNext() {
135136

136137
@Override
137138
public void release() {
138-
context.getSession().getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( jdbcStatement );
139+
final JdbcCoordinator jdbcCoordinator = context.getSession().getJdbcCoordinator();
140+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( jdbcStatement );
141+
jdbcCoordinator.afterStatementExecution();
139142
}
140143

141144
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
@@ -122,19 +122,25 @@ private void performDelete(JdbcValueBindings jdbcValueBindings, SharedSessionCon
122122

123123
final PreparedStatementGroupSingleTable statementGroup = new PreparedStatementGroupSingleTable( upsertDelete, session );
124124
final PreparedStatementDetails statementDetails = statementGroup.resolvePreparedStatementDetails( tableMapping.getTableName() );
125-
final PreparedStatement upsertDeleteStatement = statementDetails.resolveStatement();
126-
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
127-
128-
bindDeleteKeyValues(
129-
jdbcValueBindings,
130-
optionalTableUpdate.getParameters(),
131-
statementDetails,
132-
session
133-
);
134125

135-
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
136-
.executeUpdate( upsertDeleteStatement, statementDetails.getSqlString() );
137-
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upsert-deleted from `%s`", rowCount, tableMapping.getTableName() );
126+
try {
127+
final PreparedStatement upsertDeleteStatement = statementDetails.resolveStatement();
128+
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
129+
130+
bindDeleteKeyValues(
131+
jdbcValueBindings,
132+
optionalTableUpdate.getParameters(),
133+
statementDetails,
134+
session
135+
);
136+
137+
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
138+
.executeUpdate( upsertDeleteStatement, statementDetails.getSqlString() );
139+
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upsert-deleted from `%s`", rowCount, tableMapping.getTableName() );
140+
}
141+
finally {
142+
statementDetails.releaseStatement( session );
143+
}
138144
}
139145

140146
private void bindDeleteKeyValues(
@@ -196,15 +202,20 @@ private void performUpsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon
196202
final PreparedStatementGroupSingleTable statementGroup = new PreparedStatementGroupSingleTable( upsertOperation, session );
197203
final PreparedStatementDetails statementDetails = statementGroup.resolvePreparedStatementDetails( tableMapping.getTableName() );
198204

199-
final PreparedStatement updateStatement = statementDetails.resolveStatement();
200-
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
205+
try {
206+
final PreparedStatement updateStatement = statementDetails.resolveStatement();
207+
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
201208

202-
jdbcValueBindings.beforeStatement( statementDetails );
209+
jdbcValueBindings.beforeStatement( statementDetails );
203210

204-
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
205-
.executeUpdate( updateStatement, statementDetails.getSqlString() );
211+
final int rowCount = session.getJdbcCoordinator().getResultSetReturn()
212+
.executeUpdate( updateStatement, statementDetails.getSqlString() );
206213

207-
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upserted into `%s`", rowCount, tableMapping.getTableName() );
214+
MODEL_MUTATION_LOGGER.tracef( "`%s` rows upserted into `%s`", rowCount, tableMapping.getTableName() );
215+
}
216+
finally {
217+
statementDetails.releaseStatement( session );
218+
}
208219
}
209220

210221
/*

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
@@ -170,13 +170,20 @@ public void performMutation(
170170
private void performDelete(JdbcValueBindings jdbcValueBindings, SharedSessionContractImplementor session) {
171171
final JdbcDeleteMutation jdbcDelete = createJdbcDelete( session );
172172

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

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

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

182189
private void bindKeyValues(
@@ -343,6 +350,9 @@ private boolean performUpdate(
343350
statementDetails.getSqlString()
344351
);
345352
}
353+
finally {
354+
statementDetails.releaseStatement( session );
355+
}
346356
}
347357

348358
/*
@@ -386,7 +396,8 @@ protected JdbcMutationOperation createJdbcUpdate(SharedSessionContractImplemento
386396
private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionContractImplementor session) {
387397
final JdbcInsertMutation jdbcInsert = createJdbcInsert( session );
388398

389-
final PreparedStatement insertStatement = createStatementDetails( jdbcInsert, session );
399+
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
400+
final PreparedStatement insertStatement = createStatementDetails( jdbcInsert, jdbcCoordinator );
390401

391402
try {
392403
session.getJdbcServices().getSqlStatementLogger().logStatement( jdbcInsert.getSqlString() );
@@ -415,11 +426,12 @@ private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon
415426
} );
416427
}
417428

418-
session.getJdbcCoordinator().getResultSetReturn()
429+
jdbcCoordinator.getResultSetReturn()
419430
.executeUpdate( insertStatement, jdbcInsert.getSqlString() );
420431
}
421432
finally {
422-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( insertStatement );
433+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( insertStatement );
434+
jdbcCoordinator.afterStatementExecution();
423435
}
424436
}
425437

@@ -463,11 +475,10 @@ protected JdbcInsertMutation createJdbcInsert(SharedSessionContractImplementor s
463475

464476
private static PreparedStatement createStatementDetails(
465477
PreparableMutationOperation operation,
466-
SharedSessionContractImplementor session) {
467-
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
478+
JdbcCoordinator jdbcCoordinator) {
468479
final MutationStatementPreparer statementPreparer = jdbcCoordinator.getMutationStatementPreparer();
469480
final PreparedStatement statement = statementPreparer.prepareStatement( operation.getSqlString(), false );
470-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().register( null, statement );
481+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().register( null, statement );
471482
return statement;
472483
}
473484

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.dialect.pagination.LimitHandler;
1515
import org.hibernate.dialect.pagination.NoopLimitHandler;
1616
import org.hibernate.engine.jdbc.spi.JdbcServices;
17+
import org.hibernate.engine.jdbc.spi.JdbcCoordinator;
1718
import org.hibernate.engine.jdbc.spi.SqlStatementLogger;
1819
import org.hibernate.engine.spi.SessionEventListenerManager;
1920
import org.hibernate.engine.spi.SessionFactoryImplementor;
@@ -333,8 +334,9 @@ protected LockMode determineFollowOnLockMode(LockOptions lockOptions) {
333334

334335
@Override
335336
public void release() {
336-
final LogicalConnectionImplementor logicalConnection =
337-
getPersistenceContext().getJdbcCoordinator().getLogicalConnection();
337+
final JdbcCoordinator jdbcCoordinator =
338+
getPersistenceContext().getJdbcCoordinator();
339+
final LogicalConnectionImplementor logicalConnection = jdbcCoordinator.getLogicalConnection();
338340
if ( resultSet != null ) {
339341
logicalConnection.getResourceRegistry().release( resultSet, preparedStatement );
340342
resultSet = null;
@@ -343,9 +345,8 @@ public void release() {
343345
if ( preparedStatement != null ) {
344346
logicalConnection.getResourceRegistry().release( preparedStatement );
345347
preparedStatement = null;
348+
jdbcCoordinator.afterStatementExecution();
346349
}
347-
348-
logicalConnection.afterStatement();
349350
}
350351

351352
@Override

0 commit comments

Comments
 (0)