Skip to content

Commit a7940a0

Browse files
author
Fedorov, Mikhail
committed
Fix performance bug with large number of unnamed parameters
On some occasions where col in (:args) contain a really lot args, 10k+ for instance, this commit fixes a performance (high CPU) bug by NOT traversing the whole map in basically O(n^2) manner Signed-off-by: Mikhail Fedorov <mfedorov761@gmail.com>
1 parent e6fe49d commit a7940a0

File tree

2 files changed

+6
-10
lines changed

2 files changed

+6
-10
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -625,20 +625,16 @@ private Expression bind(@Nullable Object mappedValue, SQLType sqlType, MapSqlPar
625625
}
626626

627627
private static String getUniqueName(MapSqlParameterSource parameterSource, String name) {
628-
629-
Map<String, Object> values = parameterSource.getValues();
630-
631-
if (!values.containsKey(name)) {
628+
Map<String, Object> parameters = parameterSource.getValues();
629+
Object existingName = parameters.get(name);
630+
if (existingName == null) {
632631
return name;
633632
}
634-
635-
int counter = 1;
633+
int counter = parameters.size();
636634
String uniqueName;
637-
638635
do {
639636
uniqueName = name + (counter++);
640-
} while (values.containsKey(uniqueName));
641-
637+
} while (parameters.containsKey(uniqueName));
642638
return uniqueName;
643639
}
644640

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/QueryMapperUnitTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public void shouldMapNestedGroup() {
121121
Condition condition = map(criteria);
122122

123123
assertThat(condition).hasToString(
124-
"(person.\"NAME\" = ?[:name]) AND (person.\"NAME\" = ?[:name1] OR person.age < ?[:age] OR (person.\"NAME\" != ?[:name2] AND person.age > ?[:age1]))");
124+
"(person.\"NAME\" = ?[:name]) AND (person.\"NAME\" = ?[:name1] OR person.age < ?[:age] OR (person.\"NAME\" != ?[:name3] AND person.age > ?[:age4]))");
125125
}
126126

127127
@Test // DATAJDBC-318

0 commit comments

Comments
 (0)