Skip to content

Commit 80626c9

Browse files
committed
HHH-19668 Reduce size of collections held in ParameterInterpretationImpl before storing them in the cache
Instances of ParameterInterpretationImpl are being held in the interpretation cache for native queries. We had reports of these elements having a substantial impact on memory consumption. A simple improvement is to ensure the collections being held on by the container object are minimized; some more substantial improvements could also be investigated but I’ll leave those for another time.
1 parent 3e651ab commit 80626c9

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

hibernate-core/src/main/java/org/hibernate/internal/util/collections/CollectionHelper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,9 @@ public static <T> Set<T> toSmallSet(Set<T> set) {
343343
* The goal is to save memory.
344344
*/
345345
public static <K, V> Map<K, V> toSmallMap(final Map<K, V> map) {
346+
if ( map == null ) {
347+
return emptyMap();
348+
}
346349
return switch ( map.size() ) {
347350
case 0 -> emptyMap();
348351
case 1 -> {
@@ -363,6 +366,9 @@ public static <K, V> Map<K, V> toSmallMap(final Map<K, V> map) {
363366
* The goal is to save memory.
364367
*/
365368
public static <V> List<V> toSmallList(ArrayList<V> arrayList) {
369+
if ( arrayList == null ) {
370+
return emptyList();
371+
}
366372
return switch ( arrayList.size() ) {
367373
case 0 -> emptyList();
368374
case 1 -> singletonList( arrayList.get( 0 ) );

hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@
128128
import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
129129
import static org.hibernate.internal.util.collections.CollectionHelper.isNotEmpty;
130130
import static org.hibernate.internal.util.collections.CollectionHelper.makeCopy;
131+
import static org.hibernate.internal.util.collections.CollectionHelper.toSmallList;
132+
import static org.hibernate.internal.util.collections.CollectionHelper.toSmallMap;
131133
import static org.hibernate.internal.util.type.PrimitiveWrapperHelper.getDescriptorByPrimitiveType;
132134
import static org.hibernate.jpa.HibernateHints.HINT_NATIVE_LOCK_MODE;
133135
import static org.hibernate.query.results.internal.Builders.resultClassBuilder;
@@ -1742,9 +1744,9 @@ private static class ParameterInterpretationImpl implements ParameterInterpretat
17421744

17431745
public ParameterInterpretationImpl(ParameterRecognizerImpl parameterRecognizer) {
17441746
this.sqlString = parameterRecognizer.getAdjustedSqlString();
1745-
this.parameterList = parameterRecognizer.getParameterList();
1746-
this.positionalParameters = parameterRecognizer.getPositionalQueryParameters();
1747-
this.namedParameters = parameterRecognizer.getNamedQueryParameters();
1747+
this.parameterList = toSmallList( parameterRecognizer.getParameterList() );
1748+
this.positionalParameters = toSmallMap( parameterRecognizer.getPositionalQueryParameters() );
1749+
this.namedParameters = toSmallMap( parameterRecognizer.getNamedQueryParameters() );
17481750
}
17491751

17501752
@Override

hibernate-core/src/main/java/org/hibernate/query/sql/internal/ParameterRecognizerImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.util.ArrayList;
88
import java.util.Arrays;
99
import java.util.HashMap;
10-
import java.util.List;
1110
import java.util.Map;
1211

1312
import org.hibernate.QueryException;
@@ -36,7 +35,7 @@ private enum ParameterStyle {
3635

3736
private int ordinalParameterImplicitPosition;
3837

39-
private List<ParameterOccurrence> parameterList;
38+
private ArrayList<ParameterOccurrence> parameterList;
4039
private final StringBuilder sqlStringBuffer = new StringBuilder();
4140

4241
public ParameterRecognizerImpl() {
@@ -81,7 +80,7 @@ public Map<Integer, QueryParameterImplementor<?>> getPositionalQueryParameters()
8180
return positionalQueryParameters;
8281
}
8382

84-
public List<ParameterOccurrence> getParameterList() {
83+
public ArrayList<ParameterOccurrence> getParameterList() {
8584
return parameterList;
8685
}
8786

0 commit comments

Comments
 (0)