From 393a85493969aafb4b49325bafabd9791a78ecc6 Mon Sep 17 00:00:00 2001 From: Chienlin Date: Mon, 17 Nov 2025 21:45:55 +0800 Subject: [PATCH] Fix: SQL Server DDL's VARCHAR usage causes Implicit Conversion on session lookups The DDL for key string columns (PRINCIPAL_NAME and ATTRIBUTE_NAME) uses VARCHAR. This creates a type mismatch because the MS JDBC Driver typically sends Unicode (NVARCHAR) parameters. This forces an Implicit Conversion on lookups and joins, severely hindering index utilization. This causes Index Scan regression and significant performance degradation under load for session operations. We adjust these columns to NVARCHAR to ensure Correct-by-Default behavior and optimal index performance. See similar structural fix in spring-batch: #5065 Signed-off-by: Chienlin --- .../org/springframework/session/jdbc/schema-sqlserver.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-sqlserver.sql b/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-sqlserver.sql index 1d77a63f9..5706efd27 100644 --- a/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-sqlserver.sql +++ b/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-sqlserver.sql @@ -5,7 +5,7 @@ CREATE TABLE SPRING_SESSION ( LAST_ACCESS_TIME BIGINT NOT NULL, MAX_INACTIVE_INTERVAL INT NOT NULL, EXPIRY_TIME BIGINT NOT NULL, - PRINCIPAL_NAME VARCHAR(100), + PRINCIPAL_NAME NVARCHAR(100), CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID) ); @@ -15,7 +15,7 @@ CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME); CREATE TABLE SPRING_SESSION_ATTRIBUTES ( SESSION_PRIMARY_ID CHAR(36) NOT NULL, - ATTRIBUTE_NAME VARCHAR(200) NOT NULL, + ATTRIBUTE_NAME NVARCHAR(200) NOT NULL, ATTRIBUTE_BYTES IMAGE NOT NULL, CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE