11
11
import java .sql .SQLException ;
12
12
import java .sql .Statement ;
13
13
import java .util .ArrayList ;
14
- import java .util .HashMap ;
15
14
16
- import org .hibernate .HibernateException ;
17
15
import org .hibernate .JDBCException ;
18
16
import org .hibernate .internal .CoreLogging ;
19
17
import org .hibernate .internal .CoreMessageLogger ;
@@ -40,17 +38,9 @@ public final class ResourceRegistryStandardImpl implements ResourceRegistry {
40
38
private static final CoreMessageLogger log = CoreLogging .messageLogger ( ResourceRegistryStandardImpl .class );
41
39
private static final boolean IS_TRACE_ENABLED = log .isTraceEnabled ();
42
40
43
- // Dummy value to associate with an Object in the backing Map when we use it as a set:
44
- private static final Object PRESENT = new Object ();
45
-
46
- //Used instead of Collections.EMPTY_SET to avoid polymorphic calls on xref;
47
- //Also, uses an HashMap as it were an HashSet, as technically we just need the Set semantics
48
- //but in this case the overhead of HashSet is not negligible.
49
- private static final HashMap <ResultSet ,Object > EMPTY = new HashMap <>( 1 , 0.2f );
50
-
51
41
private final JdbcEventHandler jdbcEventHandler ;
52
42
53
- private final HashMap < Statement , HashMap < ResultSet , Object >> xref = new HashMap <> ();
43
+ private final ResultsetsTrackingContainer xref = new ResultsetsTrackingContainer ();
54
44
55
45
private ExtendedState ext ;
56
46
private Statement lastQuery ;
@@ -65,18 +55,15 @@ public ResourceRegistryStandardImpl(JdbcEventHandler jdbcEventHandler) {
65
55
66
56
@ Override
67
57
public boolean hasRegisteredResources () {
68
- return hasRegistered ( xref )
58
+ return xref . hasRegisteredResources ( )
69
59
|| ext != null && ext .hasRegisteredResources ();
70
60
}
71
61
72
62
@ Override
73
63
public void register (Statement statement , boolean cancelable ) {
74
64
if ( IS_TRACE_ENABLED ) log .tracef ( "Registering statement [%s]" , statement );
75
65
76
- HashMap <ResultSet ,Object > previousValue = xref .putIfAbsent ( statement , EMPTY );
77
- if ( previousValue != null ) {
78
- throw new HibernateException ( "JDBC Statement already registered" );
79
- }
66
+ xref .registerExpectingNew ( statement );
80
67
81
68
if ( cancelable ) {
82
69
lastQuery = statement ;
@@ -87,7 +74,7 @@ public void register(Statement statement, boolean cancelable) {
87
74
public void release (Statement statement ) {
88
75
if ( IS_TRACE_ENABLED ) log .tracev ( "Releasing statement [{0}]" , statement );
89
76
90
- final HashMap < ResultSet , Object > resultSets = xref .remove ( statement );
77
+ final ResultSetsSet resultSets = xref .remove ( statement );
91
78
if ( resultSets != null ) {
92
79
closeAll ( resultSets );
93
80
}
@@ -117,12 +104,12 @@ public void release(ResultSet resultSet, Statement statement) {
117
104
}
118
105
}
119
106
if ( statement != null ) {
120
- final HashMap < ResultSet , Object > resultSets = xref .get ( statement );
107
+ final ResultSetsSet resultSets = xref .getForResultSetRemoval ( statement );
121
108
if ( resultSets == null ) {
122
109
log .unregisteredStatement ();
123
110
}
124
111
else {
125
- resultSets .remove ( resultSet );
112
+ resultSets .removeResultSet ( resultSet );
126
113
if ( resultSets .isEmpty () ) {
127
114
try {
128
115
if ( statement .isClosed () ) {
@@ -143,15 +130,14 @@ public void release(ResultSet resultSet, Statement statement) {
143
130
close ( resultSet );
144
131
}
145
132
146
- private static void closeAll (final HashMap < ResultSet , Object > resultSets ) {
133
+ private static void closeAll (final ResultSetsSet resultSets ) {
147
134
if ( resultSets == null ) {
148
135
return ;
149
136
}
150
- resultSets .forEach ( (resultSet , o ) -> close ( resultSet ) );
151
- resultSets .clear ();
137
+ resultSets .forEachResultSet ( ResourceRegistryStandardImpl ::close );
152
138
}
153
139
154
- private static void releaseXref (final Statement s , final HashMap < ResultSet , Object > r ) {
140
+ private static void releaseXref (final Statement s , final ResultSetsSet r ) {
155
141
closeAll ( r );
156
142
close ( s );
157
143
}
@@ -219,19 +205,7 @@ public void register(ResultSet resultSet, Statement statement) {
219
205
}
220
206
}
221
207
if ( statement != null ) {
222
- HashMap <ResultSet ,Object > resultSets = xref .get ( statement );
223
-
224
- // Keep this at DEBUG level, rather than warn. Numerous connection pool implementations can return a
225
- // proxy/wrapper around the JDBC Statement, causing excessive logging here. See HHH-8210.
226
- if ( resultSets == null ) {
227
- log .debug ( "ResultSet statement was not registered (on register)" );
228
- }
229
-
230
- if ( resultSets == null || resultSets == EMPTY ) {
231
- resultSets = new HashMap <>();
232
- xref .put ( statement , resultSets );
233
- }
234
- resultSets .put ( resultSet , PRESENT );
208
+ xref .storeAssociatedResultset ( statement , resultSet );
235
209
}
236
210
else {
237
211
getExtendedStateForWrite ().storeUnassociatedResultset ( resultSet );
@@ -328,7 +302,7 @@ public void releaseResources() {
328
302
}
329
303
}
330
304
331
- private static boolean hasRegistered (final HashMap resource ) {
305
+ private static boolean hasRegistered (final ResultSetsSet resource ) {
332
306
return resource != null && !resource .isEmpty ();
333
307
}
334
308
@@ -344,7 +318,7 @@ private static boolean hasRegistered(final ArrayList resource) {
344
318
*/
345
319
private static class ExtendedState {
346
320
//All fields lazily initialized as well:
347
- private HashMap < ResultSet , Object > unassociatedResultSets ;
321
+ private ResultSetsSet unassociatedResultSets ;
348
322
private ArrayList <Blob > blobs ;
349
323
private ArrayList <Clob > clobs ;
350
324
private ArrayList <NClob > nclobs ;
@@ -357,17 +331,17 @@ public boolean hasRegisteredResources() {
357
331
}
358
332
359
333
public void releaseUnassociatedResult (final ResultSet resultSet ) {
360
- final Object removed = unassociatedResultSets == null ? null : unassociatedResultSets .remove ( resultSet );
334
+ final Object removed = unassociatedResultSets == null ? null : unassociatedResultSets .removeResultSet ( resultSet );
361
335
if ( removed == null ) {
362
336
log .unregisteredResultSetWithoutStatement ();
363
337
}
364
338
}
365
339
366
340
public void storeUnassociatedResultset (ResultSet resultSet ) {
367
341
if ( unassociatedResultSets == null ) {
368
- this .unassociatedResultSets = new HashMap <> ();
342
+ this .unassociatedResultSets = new ResultSetsSet ();
369
343
}
370
- unassociatedResultSets .put ( resultSet , PRESENT );
344
+ unassociatedResultSets .storeResultSet ( resultSet );
371
345
}
372
346
373
347
public void registerBlob (final Blob blob ) {
@@ -394,6 +368,7 @@ public void registerNClob(final NClob nclob) {
394
368
395
369
public void releaseResources () {
396
370
closeAll ( unassociatedResultSets );
371
+ unassociatedResultSets .clear ();
397
372
398
373
if ( blobs != null ) {
399
374
blobs .forEach ( blob -> {
0 commit comments