Skip to content

Commit 3d89a9d

Browse files
committed
HHH-10297 : Cache HashMap in AbstractRowReader instead of re-creating for each row that is read
(cherry picked from commit ccc99c6)
1 parent fa7a675 commit 3d89a9d

File tree

1 file changed

+36
-25
lines changed

1 file changed

+36
-25
lines changed

hibernate-core/src/main/java/org/hibernate/loader/plan/exec/process/internal/AbstractRowReader.java

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,33 @@ public abstract class AbstractRowReader implements RowReader {
4646
private final List<CollectionReferenceInitializer> arrayReferenceInitializers;
4747
private final List<CollectionReferenceInitializer> collectionReferenceInitializers;
4848

49+
// cache map for looking up EntityReferenceInitializer by EntityReference to help with resolving
50+
// bidirectional EntityReference and fetches.
51+
private final Map<EntityReference,EntityReferenceInitializer> entityInitializerByEntityReference;
52+
4953
public AbstractRowReader(ReaderCollector readerCollector) {
50-
this.entityReferenceInitializers = readerCollector.getEntityReferenceInitializers() != null
51-
? new ArrayList<EntityReferenceInitializer>( readerCollector.getEntityReferenceInitializers() )
52-
: Collections.<EntityReferenceInitializer>emptyList();
53-
this.arrayReferenceInitializers = readerCollector.getArrayReferenceInitializers() != null
54+
if ( CollectionHelper.isNotEmpty( readerCollector.getEntityReferenceInitializers() ) ) {
55+
entityReferenceInitializers = new ArrayList<EntityReferenceInitializer>(
56+
readerCollector.getEntityReferenceInitializers()
57+
);
58+
entityInitializerByEntityReference =
59+
new HashMap<EntityReference, EntityReferenceInitializer>( entityReferenceInitializers.size() );
60+
for ( EntityReferenceInitializer entityReferenceInitializer : entityReferenceInitializers ) {
61+
entityInitializerByEntityReference.put(
62+
entityReferenceInitializer.getEntityReference(),
63+
entityReferenceInitializer
64+
);
65+
}
66+
}
67+
else {
68+
entityReferenceInitializers = Collections.<EntityReferenceInitializer>emptyList();
69+
entityInitializerByEntityReference = Collections.<EntityReference,EntityReferenceInitializer>emptyMap();
70+
}
71+
this.arrayReferenceInitializers = CollectionHelper.isNotEmpty( readerCollector.getArrayReferenceInitializers() )
5472
? new ArrayList<CollectionReferenceInitializer>( readerCollector.getArrayReferenceInitializers() )
5573
: Collections.<CollectionReferenceInitializer>emptyList();
56-
this.collectionReferenceInitializers = readerCollector.getNonArrayCollectionReferenceInitializers() != null
74+
this.collectionReferenceInitializers =
75+
CollectionHelper.isNotEmpty ( readerCollector.getNonArrayCollectionReferenceInitializers() )
5776
? new ArrayList<CollectionReferenceInitializer>( readerCollector.getNonArrayCollectionReferenceInitializers() )
5877
: Collections.<CollectionReferenceInitializer>emptyList();
5978
}
@@ -71,17 +90,11 @@ public Object readRow(ResultSet resultSet, ResultSetProcessingContextImpl contex
7190
for ( EntityReferenceInitializer entityReferenceInitializer : entityReferenceInitializers ) {
7291
entityReferenceInitializer.hydrateIdentifier( resultSet, context );
7392
}
74-
final Map<EntityReference,EntityReferenceInitializer> initializerByEntityReference =
75-
new HashMap<EntityReference, EntityReferenceInitializer>( entityReferenceInitializers.size() );
76-
for ( EntityReferenceInitializer entityReferenceInitializerFromMap : entityReferenceInitializers ) {
77-
initializerByEntityReference.put( entityReferenceInitializerFromMap.getEntityReference(), entityReferenceInitializerFromMap );
78-
}
7993
for ( EntityReferenceInitializer entityReferenceInitializer : entityReferenceInitializers ) {
8094
resolveEntityKey(
8195
resultSet,
8296
context,
83-
entityReferenceInitializer,
84-
initializerByEntityReference
97+
entityReferenceInitializer
8598
);
8699
}
87100

@@ -120,45 +133,43 @@ public Object readRow(ResultSet resultSet, ResultSetProcessingContextImpl contex
120133
private void resolveEntityKey(
121134
ResultSet resultSet,
122135
ResultSetProcessingContextImpl context,
123-
EntityReferenceInitializer entityReferenceInitializer,
124-
Map<EntityReference,EntityReferenceInitializer> initializerByEntityReference) throws SQLException {
136+
EntityReferenceInitializer entityReferenceInitializer) throws SQLException {
125137
final EntityReference entityReference = entityReferenceInitializer.getEntityReference();
126138
final EntityIdentifierDescription identifierDescription = entityReference.getIdentifierDescription();
127139

128140
if ( identifierDescription.hasFetches() || identifierDescription.hasBidirectionalEntityReferences() ) {
129-
resolveEntityKey( resultSet, context, (FetchSource) identifierDescription, initializerByEntityReference );
141+
resolveEntityKey( resultSet, context, (FetchSource) identifierDescription );
130142
}
131143
entityReferenceInitializer.resolveEntityKey( resultSet, context );
132144
}
133145

134146
private void resolveEntityKey(
135147
ResultSet resultSet,
136148
ResultSetProcessingContextImpl context,
137-
FetchSource fetchSource,
138-
Map<EntityReference,EntityReferenceInitializer> initializerByEntityReference) throws SQLException {
149+
FetchSource fetchSource) throws SQLException {
139150
// Resolve any bidirectional entity references first.
140151
for ( BidirectionalEntityReference bidirectionalEntityReference : fetchSource.getBidirectionalEntityReferences() ) {
141-
final EntityReferenceInitializer targetEntityReferenceInitializer = initializerByEntityReference.get(
152+
final EntityReferenceInitializer targetEntityReferenceInitializer = entityInitializerByEntityReference.get(
142153
bidirectionalEntityReference.getTargetEntityReference()
143154
);
144155
resolveEntityKey(
145156
resultSet,
146157
context,
147-
targetEntityReferenceInitializer,
148-
initializerByEntityReference
158+
targetEntityReferenceInitializer
149159
);
150160
targetEntityReferenceInitializer.hydrateEntityState( resultSet, context );
151161
}
152162
for ( Fetch fetch : fetchSource.getFetches() ) {
153163
if ( EntityFetch.class.isInstance( fetch ) ) {
154164
final EntityFetch entityFetch = (EntityFetch) fetch;
155-
final EntityReferenceInitializer entityReferenceInitializer = initializerByEntityReference.get( entityFetch );
165+
final EntityReferenceInitializer entityReferenceInitializer = entityInitializerByEntityReference.get(
166+
entityFetch
167+
);
156168
if ( entityReferenceInitializer != null ) {
157169
resolveEntityKey(
158170
resultSet,
159171
context,
160-
entityReferenceInitializer,
161-
initializerByEntityReference
172+
entityReferenceInitializer
162173
);
163174
entityReferenceInitializer.hydrateEntityState( resultSet, context );
164175
}
@@ -167,8 +178,8 @@ else if ( CompositeFetch.class.isInstance( fetch ) ) {
167178
resolveEntityKey(
168179
resultSet,
169180
context,
170-
(CompositeFetch) fetch,
171-
initializerByEntityReference );
181+
(CompositeFetch) fetch
182+
);
172183
}
173184
}
174185
}

0 commit comments

Comments
 (0)