From 58a3f01ccd285999c86293e751ea04d821fad931 Mon Sep 17 00:00:00 2001 From: Mikhail Fedorov Date: Thu, 1 May 2025 03:46:14 +0300 Subject: [PATCH] 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 Squashed by Jens Schauder Original pull request #2050 --- .../springframework/data/jdbc/core/convert/QueryMapper.java | 3 ++- .../data/jdbc/core/convert/QueryMapperUnitTests.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java index 8bbc44dd1..1d3ce3095 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/QueryMapper.java @@ -53,6 +53,7 @@ import org.springframework.util.ClassUtils; * @author Mark Paluch * @author Jens Schauder * @author Yan Qiang + * @author Mikhail Fedorov * @since 3.0 */ public class QueryMapper { @@ -632,7 +633,7 @@ public class QueryMapper { return name; } - int counter = 1; + int counter = values.size(); String uniqueName; do { diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/QueryMapperUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/QueryMapperUnitTests.java index d7ad16364..a67da7397 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/QueryMapperUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/QueryMapperUnitTests.java @@ -46,6 +46,7 @@ import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; * * @author Mark Paluch * @author Jens Schauder + * @author Mikhail Fedorov */ public class QueryMapperUnitTests { @@ -121,7 +122,7 @@ public class QueryMapperUnitTests { Condition condition = map(criteria); assertThat(condition).hasToString( - "(person.\"NAME\" = ?[:name]) AND (person.\"NAME\" = ?[:name1] OR person.age < ?[:age] OR (person.\"NAME\" != ?[:name2] AND person.age > ?[:age1]))"); + "(person.\"NAME\" = ?[:name]) AND (person.\"NAME\" = ?[:name1] OR person.age < ?[:age] OR (person.\"NAME\" != ?[:name3] AND person.age > ?[:age4]))"); } @Test // DATAJDBC-318