Skip to content

Commit 9f3676d

Browse files
mbelladebeikov
authored andcommitted
HHH-17688 Make statement release more consistent in mutation delegates
1 parent 02fa42d commit 9f3676d

8 files changed

+50
-26
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,10 @@ protected void performNonBatchedMutation(
9999

100100
// If we get here the statement is needed - make sure it is resolved
101101
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
102-
valueBindings.beforeStatement( statementDetails );
103102

104103
try {
104+
valueBindings.beforeStatement( statementDetails );
105+
105106
final int affectedRowCount = session.getJdbcCoordinator()
106107
.getResultSetReturn()
107108
.executeUpdate( statementDetails.getStatement(), statementDetails.getSqlString() );

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,10 @@ private void executeWithId(
204204
);
205205

206206
session.getJdbcServices().getSqlStatementLogger().logStatement( statementDetails.getSqlString() );
207-
valueBindings.beforeStatement( statementDetails );
208207

209208
try {
209+
valueBindings.beforeStatement( statementDetails );
210+
210211
final int affectedRowCount = session.getJdbcCoordinator()
211212
.getResultSetReturn()
212213
.executeUpdate( statementDetails.getStatement(), statementDetails.getSqlString() );
@@ -224,6 +225,8 @@ private void executeWithId(
224225

225226
@Override
226227
public void release() {
228+
// The mutation delegate already releases the identity insert statement
229+
assert identityInsertStatementDetails.getStatement() == null;
227230
secondaryTablesStatementGroup.release();
228231
}
229232

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ public Object execute(
112112

113113
@Override
114114
public void release() {
115-
identityInsertStatementDetails.releaseStatement( session );
115+
// Nothing to do - the mutation delegate already releases the identity insert statement
116+
assert identityInsertStatementDetails.getStatement() == null;
116117
}
117118

118119
@Override

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,21 @@ public Object performInsert(
3838
Object entity,
3939
SharedSessionContractImplementor session) {
4040
session.getJdbcServices().getSqlStatementLogger().logStatement( insertStatementDetails.getSqlString() );
41-
valueBindings.beforeStatement( insertStatementDetails );
42-
return executeAndExtract( insertStatementDetails.getSqlString(), insertStatementDetails.getStatement(), session );
41+
try {
42+
valueBindings.beforeStatement( insertStatementDetails );
43+
return executeAndExtract(
44+
insertStatementDetails.getSqlString(),
45+
insertStatementDetails.getStatement(),
46+
session
47+
);
48+
}
49+
finally {
50+
if ( insertStatementDetails.getStatement() != null ) {
51+
insertStatementDetails.releaseStatement( session );
52+
}
53+
valueBindings.afterStatement( insertStatementDetails.getMutatingTableDetails() );
54+
session.getJdbcCoordinator().afterStatementExecution();
55+
}
4356
}
4457

4558
@Override

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,19 @@ public Object performInsert(
7070
final JdbcServices jdbcServices = session.getJdbcServices();
7171

7272
jdbcServices.getSqlStatementLogger().logStatement( insertStatementDetails.getSqlString() );
73-
jdbcValueBindings.beforeStatement( insertStatementDetails );
7473

75-
jdbcCoordinator.getResultSetReturn()
76-
.executeUpdate( insertStatementDetails.resolveStatement(), insertStatementDetails.getSqlString() );
74+
try {
75+
jdbcValueBindings.beforeStatement( insertStatementDetails );
76+
jdbcCoordinator.getResultSetReturn()
77+
.executeUpdate( insertStatementDetails.resolveStatement(), insertStatementDetails.getSqlString() );
78+
}
79+
finally {
80+
if ( insertStatementDetails.getStatement() != null ) {
81+
insertStatementDetails.releaseStatement( session );
82+
}
83+
jdbcValueBindings.afterStatement( insertStatementDetails.getMutatingTableDetails() );
84+
session.getJdbcCoordinator().afterStatementExecution();
85+
}
7786

7887
// the insert is complete, select the generated id...
7988

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,10 @@ public Object performInsert(
100100

101101
jdbcServices.getSqlStatementLogger().logStatement( insertSql );
102102

103-
final PreparedStatement insertStatement = insertStatementDetails.resolveStatement();
104-
jdbcValueBindings.beforeStatement( insertStatementDetails );
105-
106103
try {
104+
final PreparedStatement insertStatement = insertStatementDetails.resolveStatement();
105+
jdbcValueBindings.beforeStatement( insertStatementDetails );
106+
107107
jdbcCoordinator.getResultSetReturn().executeUpdate( insertStatement, insertSql );
108108

109109
try {
@@ -131,16 +131,20 @@ public Object performInsert(
131131
}
132132
}
133133
}
134-
finally {
135-
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( insertStatement );
134+
catch (SQLException e) {
135+
throw jdbcServices.getSqlExceptionHelper().convert(
136+
e,
137+
"Unable to extract generated-keys ResultSet",
138+
insertSql
139+
);
136140
}
137141
}
138-
catch (SQLException e) {
139-
throw jdbcServices.getSqlExceptionHelper().convert(
140-
e,
141-
"Unable to extract generated-keys ResultSet",
142-
insertSql
143-
);
142+
finally {
143+
if ( insertStatementDetails.getStatement() != null ) {
144+
insertStatementDetails.releaseStatement( session );
145+
}
146+
jdbcValueBindings.afterStatement( insertStatementDetails.getMutatingTableDetails() );
147+
jdbcCoordinator.afterStatementExecution();
144148
}
145149
}
146150

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,6 @@ protected Object executeAndExtract(
7777
insertSql
7878
);
7979
}
80-
finally {
81-
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( resultSet, insertStatement );
82-
}
8380
}
8481

8582
@Override

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,5 @@ public Object executeAndExtract(
7373
insertSql
7474
);
7575
}
76-
finally {
77-
jdbcCoordinator.getLogicalConnection().getResourceRegistry().release( resultSet, insertStatement );
78-
jdbcCoordinator.afterStatementExecution();
79-
}
8076
}
8177
}

0 commit comments

Comments
 (0)