From 11892fb14b06c14d9365182efe0133f7f29f8d4e Mon Sep 17 00:00:00 2001 From: belljun3395 <195850@jnu.ac.kr> Date: Thu, 4 Sep 2025 22:29:23 +0900 Subject: [PATCH 1/2] Optimize parameter matching in TableMetaDataContext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace nested loop with pre-computed case-insensitive lookup map, reducing time complexity from O(n×m) to O(n+m) where n = number of columns and m = number of parameters. Before: Iterates through all parameter entries for each column when case-insensitive matching is needed. After: Build HashMap once for O(1) case-insensitive lookups. Signed-off-by: belljun3395 <195850@jnu.ac.kr> --- .../jdbc/core/metadata/TableMetaDataContext.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataContext.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataContext.java index 871783469f97..76d747bf93cc 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataContext.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataContext.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -265,18 +266,19 @@ public List matchInParameterValuesWithInsertColumns(SqlParameterSource p * @param inParameters the parameter names and values */ public List matchInParameterValuesWithInsertColumns(Map inParameters) { - List values = new ArrayList<>(inParameters.size()); + List values = new ArrayList<>(this.tableColumns.size()); + + Map caseInsensitiveLookup = new HashMap<>(inParameters.size()); + for (Map.Entry entry : inParameters.entrySet()) { + caseInsensitiveLookup.put(entry.getKey().toLowerCase(Locale.ROOT), entry.getValue()); + } + for (String column : this.tableColumns) { Object value = inParameters.get(column); if (value == null) { value = inParameters.get(column.toLowerCase(Locale.ROOT)); if (value == null) { - for (Map.Entry entry : inParameters.entrySet()) { - if (column.equalsIgnoreCase(entry.getKey())) { - value = entry.getValue(); - break; - } - } + value = caseInsensitiveLookup.get(column.toLowerCase(Locale.ROOT)); } } values.add(value); From cdb149bc3e9c36a4f6f98e8142b7372ad9728869 Mon Sep 17 00:00:00 2001 From: belljun3395 <195850@jnu.ac.kr> Date: Thu, 11 Sep 2025 23:50:52 +0900 Subject: [PATCH 2/2] Refactor parameter matching to use LinkedCaseInsensitiveMap for improved efficiency Signed-off-by: belljun3395 <195850@jnu.ac.kr> --- .../jdbc/core/metadata/TableMetaDataContext.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataContext.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataContext.java index 76d747bf93cc..35409b3610d8 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataContext.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataContext.java @@ -18,7 +18,6 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -37,6 +36,7 @@ import org.springframework.jdbc.support.JdbcUtils; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.StringUtils; /** @@ -268,17 +268,15 @@ public List matchInParameterValuesWithInsertColumns(SqlParameterSource p public List matchInParameterValuesWithInsertColumns(Map inParameters) { List values = new ArrayList<>(this.tableColumns.size()); - Map caseInsensitiveLookup = new HashMap<>(inParameters.size()); - for (Map.Entry entry : inParameters.entrySet()) { - caseInsensitiveLookup.put(entry.getKey().toLowerCase(Locale.ROOT), entry.getValue()); - } + LinkedCaseInsensitiveMap caseInsensitiveLookup = new LinkedCaseInsensitiveMap<>(inParameters.size()); + caseInsensitiveLookup.putAll(inParameters); for (String column : this.tableColumns) { Object value = inParameters.get(column); if (value == null) { value = inParameters.get(column.toLowerCase(Locale.ROOT)); if (value == null) { - value = caseInsensitiveLookup.get(column.toLowerCase(Locale.ROOT)); + value = caseInsensitiveLookup.get(column); } } values.add(value);