Skip to content

Commit 8bfec20

Browse files
committed
HHH-19477 Add missing JdbcCoordinator#afterStatement calls to enable aggressive connection release
1 parent c2034b3 commit 8bfec20

File tree

11 files changed

+87
-60
lines changed

11 files changed

+87
-60
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/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/AbstractSelectingDelegate.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ public GeneratedValues performMutation(
106106
statementDetails.releaseStatement( session );
107107
}
108108
jdbcValueBindings.afterStatement( statementDetails.getMutatingTableDetails() );
109-
session.getJdbcCoordinator().afterStatementExecution();
110109
}
111110

112111
// 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
@@ -153,7 +153,6 @@ public GeneratedValues performMutation(
153153
statementDetails.releaseStatement( session );
154154
}
155155
jdbcValueBindings.afterStatement( statementDetails.getMutatingTableDetails() );
156-
jdbcCoordinator.afterStatementExecution();
157156
}
158157
}
159158

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

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -276,22 +276,25 @@ protected void doStaticDelete(
276276
session
277277
);
278278

279-
mutationExecutor.execute(
280-
entity,
281-
null,
282-
null,
283-
(statementDetails, affectedRowCount, batchPosition) -> identifiedResultsCheck(
284-
statementDetails,
285-
affectedRowCount,
286-
batchPosition,
287-
entityPersister(),
288-
id,
289-
factory()
290-
),
291-
session
292-
);
293-
294-
mutationExecutor.release();
279+
try {
280+
mutationExecutor.execute(
281+
entity,
282+
null,
283+
null,
284+
(statementDetails, affectedRowCount, batchPosition) -> identifiedResultsCheck(
285+
statementDetails,
286+
affectedRowCount,
287+
batchPosition,
288+
entityPersister(),
289+
id,
290+
factory()
291+
),
292+
session
293+
);
294+
}
295+
finally {
296+
mutationExecutor.release();
297+
}
295298
}
296299

297300
protected void applyStaticDeleteTableDetails(

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
@@ -711,6 +711,7 @@ private ProcedureOutputsImpl buildOutputs() {
711711
}
712712
catch (SQLException e) {
713713
getSession().getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( statement );
714+
getSession().getJdbcCoordinator().afterStatementExecution();
714715
throw getSession().getJdbcServices().getSqlExceptionHelper().convert(
715716
e,
716717
"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
@@ -147,10 +147,4 @@ protected Output buildFunctionReturn() {
147147
return buildResultSetOutput( () -> results );
148148
}
149149
}
150-
151-
@Override
152-
public void release() {
153-
super.release();
154-
getResultContext().getSession().getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( callableStatement );
155-
}
156150
}

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.jdbc.spi.SqlStatementLogger;
2021
import org.hibernate.engine.spi.SessionFactoryImplementor;
2122
import org.hibernate.event.spi.EventManager;
@@ -147,7 +148,9 @@ public boolean goToNext() {
147148

148149
@Override
149150
public void release() {
150-
context.getSession().getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( jdbcStatement );
151+
final JdbcCoordinator jdbcCoordinator = context.getSession().getJdbcCoordinator();
152+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( jdbcStatement );
153+
jdbcCoordinator.afterStatementExecution();
151154
}
152155

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

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

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

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

184191
private void bindKeyValues(
@@ -374,12 +381,16 @@ private boolean performUpdate(
374381
statementDetails.getSqlString()
375382
);
376383
}
384+
finally {
385+
statementDetails.releaseStatement( session );
386+
}
377387
}
378388

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

382-
final PreparedStatement insertStatement = createStatementDetails( jdbcInsert, session );
392+
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
393+
final PreparedStatement insertStatement = createStatementDetails( jdbcInsert, jdbcCoordinator );
383394

384395
try {
385396
session.getJdbcServices().getSqlStatementLogger().logStatement( jdbcInsert.getSqlString() );
@@ -408,11 +419,12 @@ private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon
408419
} );
409420
}
410421

411-
session.getJdbcCoordinator().getResultSetReturn()
422+
jdbcCoordinator.getResultSetReturn()
412423
.executeUpdate( insertStatement, jdbcInsert.getSqlString() );
413424
}
414425
finally {
415-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( insertStatement );
426+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( insertStatement );
427+
jdbcCoordinator.afterStatementExecution();
416428
}
417429
}
418430

@@ -453,11 +465,10 @@ private JdbcInsertMutation createJdbcInsert(SharedSessionContractImplementor ses
453465

454466
private static PreparedStatement createStatementDetails(
455467
PreparableMutationOperation operation,
456-
SharedSessionContractImplementor session) {
457-
final JdbcCoordinator jdbcCoordinator = session.getJdbcCoordinator();
468+
JdbcCoordinator jdbcCoordinator) {
458469
final MutationStatementPreparer statementPreparer = jdbcCoordinator.getMutationStatementPreparer();
459470
final PreparedStatement statement = statementPreparer.prepareStatement( operation.getSqlString(), false );
460-
session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().register( null, statement );
471+
jdbcCoordinator.getLogicalConnection().getResourceRegistry().register( null, statement );
461472
return statement;
462473
}
463474

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

Lines changed: 4 additions & 4 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;
@@ -324,8 +325,8 @@ protected LockMode determineFollowOnLockMode(LockOptions lockOptions) {
324325

325326
@Override
326327
public void release() {
327-
final LogicalConnectionImplementor logicalConnection = getPersistenceContext().getJdbcCoordinator()
328-
.getLogicalConnection();
328+
final JdbcCoordinator jdbcCoordinator = getPersistenceContext().getJdbcCoordinator();
329+
final LogicalConnectionImplementor logicalConnection = jdbcCoordinator.getLogicalConnection();
329330
if ( resultSet != null ) {
330331
logicalConnection.getResourceRegistry().release( resultSet, preparedStatement );
331332
resultSet = null;
@@ -334,9 +335,8 @@ public void release() {
334335
if ( preparedStatement != null ) {
335336
logicalConnection.getResourceRegistry().release( preparedStatement );
336337
preparedStatement = null;
338+
jdbcCoordinator.afterStatementExecution();
337339
}
338-
339-
logicalConnection.afterStatement();
340340
}
341341

342342
@Override

0 commit comments

Comments
 (0)