From ee050d66b0f00f7e03365835f160d4a3f133bda1 Mon Sep 17 00:00:00 2001 From: Chienlin Date: Thu, 30 Oct 2025 13:09:49 +0800 Subject: [PATCH 1/2] fix(jdbc): Use NVARCHAR for Spring Batch SQL Server metadata (#5064) Spring Batch SQL Server metadata tables default to VARCHAR, but the Microsoft JDBC driver sends strings as NVARCHAR. This mismatch causes implicit conversions, slows queries, and increases deadlock risk. Update schema-sqlserver.sql to use NVARCHAR for all string columns, aligning with the driver and improving performance. Signed-off-by: Chienlin --- .../batch/core/schema-sqlserver.sql | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlserver.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlserver.sql index cbb5958e1f..6b99ba8d80 100644 --- a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlserver.sql +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlserver.sql @@ -3,8 +3,8 @@ CREATE TABLE BATCH_JOB_INSTANCE ( JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY, VERSION BIGINT NULL, - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, + JOB_NAME NVARCHAR(100) NOT NULL, + JOB_KEY NVARCHAR(32) NOT NULL, constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) ) ; @@ -15,9 +15,9 @@ CREATE TABLE BATCH_JOB_EXECUTION ( CREATE_TIME DATETIME NOT NULL, START_TIME DATETIME DEFAULT NULL, END_TIME DATETIME DEFAULT NULL, - STATUS VARCHAR(10) NULL, - EXIT_CODE VARCHAR(2500) NULL, - EXIT_MESSAGE VARCHAR(2500) NULL, + STATUS NVARCHAR(10) NULL, + EXIT_CODE NVARCHAR(2500) NULL, + EXIT_MESSAGE NVARCHAR(2500) NULL, LAST_UPDATED DATETIME NULL, constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) @@ -25,9 +25,9 @@ CREATE TABLE BATCH_JOB_EXECUTION ( CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( JOB_EXECUTION_ID BIGINT NOT NULL, - PARAMETER_NAME VARCHAR(100) NOT NULL, - PARAMETER_TYPE VARCHAR(100) NOT NULL, - PARAMETER_VALUE VARCHAR(2500), + PARAMETER_NAME NVARCHAR(100) NOT NULL, + PARAMETER_TYPE NVARCHAR(100) NOT NULL, + PARAMETER_VALUE NVARCHAR(2500), IDENTIFYING CHAR(1) NOT NULL, constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) @@ -36,12 +36,12 @@ CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( CREATE TABLE BATCH_STEP_EXECUTION ( STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, + STEP_NAME NVARCHAR(100) NOT NULL, JOB_EXECUTION_ID BIGINT NOT NULL, CREATE_TIME DATETIME NOT NULL, START_TIME DATETIME DEFAULT NULL, END_TIME DATETIME DEFAULT NULL, - STATUS VARCHAR(10) NULL, + STATUS NVARCHAR(10) NULL, COMMIT_COUNT BIGINT NULL, READ_COUNT BIGINT NULL, FILTER_COUNT BIGINT NULL, @@ -50,8 +50,8 @@ CREATE TABLE BATCH_STEP_EXECUTION ( WRITE_SKIP_COUNT BIGINT NULL, PROCESS_SKIP_COUNT BIGINT NULL, ROLLBACK_COUNT BIGINT NULL, - EXIT_CODE VARCHAR(2500) NULL, - EXIT_MESSAGE VARCHAR(2500) NULL, + EXIT_CODE NVARCHAR(2500) NULL, + EXIT_MESSAGE NVARCHAR(2500) NULL, LAST_UPDATED DATETIME NULL, constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) @@ -59,16 +59,16 @@ CREATE TABLE BATCH_STEP_EXECUTION ( CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT VARCHAR(MAX) NULL, + SHORT_CONTEXT NVARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT NVARCHAR(MAX) NULL, constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) ) ; CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT VARCHAR(MAX) NULL, + SHORT_CONTEXT NVARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT NVARCHAR(MAX) NULL, constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) ) ; From d12f5dfb21762fa02809a371b775188301c490d9 Mon Sep 17 00:00:00 2001 From: Chienlin Date: Thu, 6 Nov 2025 10:01:09 +0800 Subject: [PATCH 2/2] Add migration script for v6.0 SQL Server NVARCHAR changes Signed-off-by: Chienlin --- .../migration/6.0/migration-sqlserver.sql | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/migration/6.0/migration-sqlserver.sql diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/migration/6.0/migration-sqlserver.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/migration/6.0/migration-sqlserver.sql new file mode 100644 index 0000000000..2f87bdaa39 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/migration/6.0/migration-sqlserver.sql @@ -0,0 +1,31 @@ +-- Migration script for Spring Batch 6.0 +-- Changes VARCHAR columns to NVARCHAR to align with Microsoft JDBC driver behavior +-- This improves performance by avoiding implicit conversions and reduces deadlock risk + +-- BATCH_JOB_INSTANCE table +ALTER TABLE BATCH_JOB_INSTANCE ALTER COLUMN JOB_NAME NVARCHAR(100) NOT NULL; +ALTER TABLE BATCH_JOB_INSTANCE ALTER COLUMN JOB_KEY NVARCHAR(32) NOT NULL; + +-- BATCH_JOB_EXECUTION table +ALTER TABLE BATCH_JOB_EXECUTION ALTER COLUMN STATUS NVARCHAR(10) NULL; +ALTER TABLE BATCH_JOB_EXECUTION ALTER COLUMN EXIT_CODE NVARCHAR(2500) NULL; +ALTER TABLE BATCH_JOB_EXECUTION ALTER COLUMN EXIT_MESSAGE NVARCHAR(2500) NULL; + +-- BATCH_JOB_EXECUTION_PARAMS table +ALTER TABLE BATCH_JOB_EXECUTION_PARAMS ALTER COLUMN PARAMETER_NAME NVARCHAR(100) NOT NULL; +ALTER TABLE BATCH_JOB_EXECUTION_PARAMS ALTER COLUMN PARAMETER_TYPE NVARCHAR(100) NOT NULL; +ALTER TABLE BATCH_JOB_EXECUTION_PARAMS ALTER COLUMN PARAMETER_VALUE NVARCHAR(2500); + +-- BATCH_STEP_EXECUTION table +ALTER TABLE BATCH_STEP_EXECUTION ALTER COLUMN STEP_NAME NVARCHAR(100) NOT NULL; +ALTER TABLE BATCH_STEP_EXECUTION ALTER COLUMN STATUS NVARCHAR(10) NULL; +ALTER TABLE BATCH_STEP_EXECUTION ALTER COLUMN EXIT_CODE NVARCHAR(2500) NULL; +ALTER TABLE BATCH_STEP_EXECUTION ALTER COLUMN EXIT_MESSAGE NVARCHAR(2500) NULL; + +-- BATCH_STEP_EXECUTION_CONTEXT table +ALTER TABLE BATCH_STEP_EXECUTION_CONTEXT ALTER COLUMN SHORT_CONTEXT NVARCHAR(2500) NOT NULL; +ALTER TABLE BATCH_STEP_EXECUTION_CONTEXT ALTER COLUMN SERIALIZED_CONTEXT NVARCHAR(MAX) NULL; + +-- BATCH_JOB_EXECUTION_CONTEXT table +ALTER TABLE BATCH_JOB_EXECUTION_CONTEXT ALTER COLUMN SHORT_CONTEXT NVARCHAR(2500) NOT NULL; +ALTER TABLE BATCH_JOB_EXECUTION_CONTEXT ALTER COLUMN SERIALIZED_CONTEXT NVARCHAR(MAX) NULL; \ No newline at end of file