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 9f93513f72..544622e4cc 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 @@ -76,6 +76,6 @@ CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) ) ; -CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT IDENTITY); -CREATE TABLE BATCH_JOB_EXECUTION_SEQ (ID BIGINT IDENTITY); -CREATE TABLE BATCH_JOB_SEQ (ID BIGINT IDENTITY); +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE; +CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE; diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactory.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactory.java index d95c6574b6..9258c238f9 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactory.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2018 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,6 +55,7 @@ * @author Lucas Ward * @author Michael Minella * @author Drummond Dawson + * @author Mahmoud Ben Hassine * @see DatabaseType */ public class DefaultDataFieldMaxValueIncrementerFactory implements DataFieldMaxValueIncrementerFactory { @@ -113,7 +114,7 @@ else if (databaseType == SQLITE) { return new SqliteMaxValueIncrementer(dataSource, incrementerName, incrementerColumnName); } else if (databaseType == SQLSERVER) { - return new SqlServerMaxValueIncrementer(dataSource, incrementerName, incrementerColumnName); + return new SqlServerSequenceMaxValueIncrementer(dataSource, incrementerName); } else if (databaseType == SYBASE) { return new SybaseMaxValueIncrementer(dataSource, incrementerName, incrementerColumnName); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerSequenceMaxValueIncrementer.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerSequenceMaxValueIncrementer.java new file mode 100644 index 0000000000..9bf20815d4 --- /dev/null +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerSequenceMaxValueIncrementer.java @@ -0,0 +1,38 @@ +/* + * Copyright 2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.item.database.support; + +import javax.sql.DataSource; + +import org.springframework.jdbc.support.incrementer.AbstractSequenceMaxValueIncrementer; + +/** + * Incrementer for SQL Server sequences. + * + * @author Mahmoud Ben Hassine + * @since 5.0 + */ +public class SqlServerSequenceMaxValueIncrementer extends AbstractSequenceMaxValueIncrementer { + + public SqlServerSequenceMaxValueIncrementer(DataSource dataSource, String incrementerName) { + super(dataSource, incrementerName); + } + + @Override + protected String getSequenceQuery() { + return "select next value for " + getIncrementerName(); + } +} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactoryTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactoryTests.java index d69ba7db18..c4a08e9c36 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactoryTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2018 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ * @author Lucas Ward * @author Will Schipp * @author Drummond Dawson + * @author Mahmoud Ben Hassine */ public class DefaultDataFieldMaxValueIncrementerFactoryTests extends TestCase { @@ -118,7 +119,7 @@ public void testPostgres(){ } public void testMsSqlServer(){ - assertTrue(factory.getIncrementer("sqlserver", "NAME") instanceof SqlServerMaxValueIncrementer); + assertTrue(factory.getIncrementer("sqlserver", "NAME") instanceof SqlServerSequenceMaxValueIncrementer); } public void testSybase(){ diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerSequenceMaxValueIncrementerTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerSequenceMaxValueIncrementerTests.java new file mode 100644 index 0000000000..c6e23939e7 --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerSequenceMaxValueIncrementerTests.java @@ -0,0 +1,50 @@ +/* + * Copyright 2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.item.database.support; + +import javax.sql.DataSource; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.junit.Assert.assertEquals; + +/** + * @author Mahmoud Ben Hassine + */ +@RunWith(MockitoJUnitRunner.class) +public class SqlServerSequenceMaxValueIncrementerTests { + + @Mock + private DataSource dataSource; + + private SqlServerSequenceMaxValueIncrementer incrementer; + + @Test + public void testGetSequenceQuery() { + // given + this.incrementer = new SqlServerSequenceMaxValueIncrementer(this.dataSource, "BATCH_JOB_SEQ"); + + // when + String sequenceQuery = this.incrementer.getSequenceQuery(); + + // then + Assert.assertEquals("select next value for BATCH_JOB_SEQ", sequenceQuery); + } +} \ No newline at end of file