diff --git a/spring-batch-core/pom.xml b/spring-batch-core/pom.xml index fd57e796d..3fdc23b02 100644 --- a/spring-batch-core/pom.xml +++ b/spring-batch-core/pom.xml @@ -251,7 +251,7 @@ - + @@ -264,7 +264,7 @@ - + diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-sqlserver.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-sqlserver.sql new file mode 100644 index 000000000..eca911f1d --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-sqlserver.sql @@ -0,0 +1,12 @@ +-- Autogenerated: do not edit this file + +DROP TABLE BATCH_STEP_EXECUTION_CONTEXT ; +DROP TABLE BATCH_JOB_EXECUTION_CONTEXT ; +DROP TABLE BATCH_STEP_EXECUTION ; +DROP TABLE BATCH_JOB_EXECUTION ; +DROP TABLE BATCH_JOB_PARAMS ; +DROP TABLE BATCH_JOB_INSTANCE ; + +DROP TABLE BATCH_STEP_EXECUTION_SEQ ; +DROP TABLE BATCH_JOB_EXECUTION_SEQ ; +DROP TABLE BATCH_JOB_SEQ ; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-sybase.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-sybase.sql new file mode 100644 index 000000000..eca911f1d --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-sybase.sql @@ -0,0 +1,12 @@ +-- Autogenerated: do not edit this file + +DROP TABLE BATCH_STEP_EXECUTION_CONTEXT ; +DROP TABLE BATCH_JOB_EXECUTION_CONTEXT ; +DROP TABLE BATCH_STEP_EXECUTION ; +DROP TABLE BATCH_JOB_EXECUTION ; +DROP TABLE BATCH_JOB_PARAMS ; +DROP TABLE BATCH_JOB_INSTANCE ; + +DROP TABLE BATCH_STEP_EXECUTION_SEQ ; +DROP TABLE BATCH_JOB_EXECUTION_SEQ ; +DROP TABLE BATCH_JOB_SEQ ; diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProvider.java index 403c029fd..918604d65 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProvider.java @@ -17,9 +17,10 @@ package org.springframework.batch.item.database.support; /** - * Sql Server implementation of a {@link org.springframework.batch.item.database.PagingQueryProvider} using + * Sql Server implementation of a + * {@link org.springframework.batch.item.database.PagingQueryProvider} using * database specific features. - * + * * @author Thomas Risberg * @since 2.0 */ @@ -35,6 +36,11 @@ public class SqlServerPagingQueryProvider extends SqlWindowingPagingQueryProvide return SqlPagingQueryUtils.generateTopSqlQuery(this, true, buildTopClause(pageSize)); } + @Override + protected Object getSubQueryAlias() { + return "AS TMP_SUB "; + } + private String buildTopClause(int pageSize) { return new StringBuilder().append("TOP ").append(pageSize).toString(); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProviderTests.java index d2d28605b..dd0f3864f 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/SqlServerPagingQueryProviderTests.java @@ -29,14 +29,14 @@ public class SqlServerPagingQueryProviderTests extends AbstractSqlPagingQueryPro @Test @Override public void testGenerateJumpToItemQuery() { - String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) WHERE ROW_NUMBER = 100"; + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE ROW_NUMBER = 100"; String s = pagingQueryProvider.generateJumpToItemQuery(145, pageSize); Assert.assertEquals("", sql, s); } @Test @Override public void testGenerateJumpToItemQueryForFirstPage() { - String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) WHERE ROW_NUMBER = 1"; + String sql = "SELECT SORT_KEY FROM ( SELECT id AS SORT_KEY, ROW_NUMBER() OVER (ORDER BY id ASC) AS ROW_NUMBER FROM foo WHERE bar = 1) AS TMP_SUB WHERE ROW_NUMBER = 1"; String s = pagingQueryProvider.generateJumpToItemQuery(45, pageSize); Assert.assertEquals("", sql, s); } diff --git a/spring-batch-samples/pom.xml b/spring-batch-samples/pom.xml index c651dc5cb..455b0e84c 100644 --- a/spring-batch-samples/pom.xml +++ b/spring-batch-samples/pom.xml @@ -93,6 +93,12 @@ 5.1.6 runtime + + net.sourceforge.jtds + jtds + 1.2.4 + runtime + hsqldb hsqldb diff --git a/spring-batch-samples/src/main/resources/batch-sqlserver.properties b/spring-batch-samples/src/main/resources/batch-sqlserver.properties index 4d60f4a74..8c20d2511 100644 --- a/spring-batch-samples/src/main/resources/batch-sqlserver.properties +++ b/spring-batch-samples/src/main/resources/batch-sqlserver.properties @@ -1,18 +1,17 @@ # Placeholders batch.* # for MS SQLServer: batch.jdbc.driver=net.sourceforge.jtds.jdbc.Driver -batch.jdbc.url=jdbc:jtds:sqlserver://dbhost:1433;databaseName=test -batch.jdbc.user=spring -batch.jdbc.password=spring -batch.schema= -batch.jndi.name= -batch.naming.factory.initial= -batch.naming.provider.url= +batch.jdbc.url=jdbc:jtds:sqlserver://localhost:1433;instance=SQLEXPRESS +batch.jdbc.user=sa +batch.jdbc.password=sa +batch.jdbc.testWhileIdle=false +batch.jdbc.validationQuery= +batch.drop.script=/org/springframework/batch/core/schema-drop-sqlserver.sql batch.schema.script=/org/springframework/batch/core/schema-sqlserver.sql batch.business.schema.script=business-schema-sqlserver.sql +batch.data.source.init=true batch.database.incrementer.class=org.springframework.jdbc.support.incrementer.SqlServerMaxValueIncrementer batch.lob.handler.class=org.springframework.jdbc.support.lob.DefaultLobHandler - -# Bean Properties for override -# when not using sequences: -incrementerParent.columnName=ID +batch.database.incrementer.parent=columnIncrementerParent +batch.grid.size=2 +batch.verify.cursor.position=true diff --git a/spring-batch-samples/src/main/resources/business-schema-sqlserver.sql b/spring-batch-samples/src/main/resources/business-schema-sqlserver.sql index 3ce5065e9..df575a107 100644 --- a/spring-batch-samples/src/main/resources/business-schema-sqlserver.sql +++ b/spring-batch-samples/src/main/resources/business-schema-sqlserver.sql @@ -12,12 +12,11 @@ DROP TABLE ERROR_LOG ; -- Autogenerated: do not edit this file -CREATE TABLE CUSTOMER_SEQ (ID BIGINT IDENTITY); -INSERT INTO CUSTOMER_SEQ (ID) values (5); -CREATE TABLE BATCH_STAGING_SEQ (ID BIGINT IDENTITY); -INSERT INTO BATCH_STAGING_SEQ (ID) values (0); -CREATE TABLE TRADE_SEQ (ID BIGINT IDENTITY); -INSERT INTO TRADE_SEQ (ID) values (0); +CREATE TABLE CUSTOMER_SEQ (ID BIGINT IDENTITY); +SET IDENTITY_INSERT CUSTOMER_SEQ ON; +INSERT INTO CUSTOMER_SEQ (ID) values (5); +CREATE TABLE BATCH_STAGING_SEQ (ID BIGINT IDENTITY); +CREATE TABLE TRADE_SEQ (ID BIGINT IDENTITY); CREATE TABLE BATCH_STAGING ( ID BIGINT NOT NULL PRIMARY KEY , diff --git a/spring-batch-samples/src/main/resources/jobs/iosample/jdbcPaging.xml b/spring-batch-samples/src/main/resources/jobs/iosample/jdbcPaging.xml index 4ecff3485..f6cc9b80f 100644 --- a/spring-batch-samples/src/main/resources/jobs/iosample/jdbcPaging.xml +++ b/spring-batch-samples/src/main/resources/jobs/iosample/jdbcPaging.xml @@ -22,7 +22,7 @@ - + diff --git a/spring-batch-samples/src/main/resources/log4j.properties b/spring-batch-samples/src/main/resources/log4j.properties index 9e20bcd32..4fc7fe1fc 100644 --- a/spring-batch-samples/src/main/resources/log4j.properties +++ b/spring-batch-samples/src/main/resources/log4j.properties @@ -24,7 +24,7 @@ log4j.appender.chainsaw.layout=org.apache.log4j.xml.XMLLayout ### enable spring #log4j.logger.org.springframework=info #log4j.logger.org.springframework.transaction=debug -#log4j.logger.org.springframework.jdbc.core=debug +log4j.logger.org.springframework.jdbc.core=debug #log4j.logger.org.springframework.orm=debug ### debug your specific package or classes with the following example diff --git a/spring-batch-samples/src/main/sql/sqlserver.vpp b/spring-batch-samples/src/main/sql/sqlserver.vpp index 12e5ad571..c96a13c50 100644 --- a/spring-batch-samples/src/main/sql/sqlserver.vpp +++ b/spring-batch-samples/src/main/sql/sqlserver.vpp @@ -1,4 +1,5 @@ #macro (sequence $name $value)CREATE TABLE ${name} (ID BIGINT IDENTITY); +SET IDENTITY_INSERT ${name} ON; INSERT INTO ${name} (ID) values (${value}); #end #macro (notnull $name $type)ALTER COLUMN ${name} ${type} NOT NULL#end diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/iosample/JdbcPagingRestartIntegrationTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/iosample/JdbcPagingRestartIntegrationTests.java new file mode 100644 index 000000000..7b3e38971 --- /dev/null +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/iosample/JdbcPagingRestartIntegrationTests.java @@ -0,0 +1,63 @@ +/* + * Copyright 2006-2007 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 + * + * http://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.sample.iosample; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.batch.core.JobParametersBuilder; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemStream; +import org.springframework.batch.sample.domain.trade.CustomerCredit; +import org.springframework.batch.test.MetaDataInstanceFactory; +import org.springframework.batch.test.StepScopeTestExecutionListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; + +/** + * @author Dave Syer + * @since 2.1 + */ +@RunWith(SpringJUnit4ClassRunner.class) +@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class }) +@ContextConfiguration(locations = { "/simple-job-launcher-context.xml", "/jobs/ioSampleJob.xml", + "/jobs/iosample/jdbcPaging.xml" }) +public class JdbcPagingRestartIntegrationTests { + + @Autowired + private ItemReader reader; + + public StepExecution getStepExecution() { + return MetaDataInstanceFactory.createStepExecution(new JobParametersBuilder().addDouble("credit", 10000.) + .toJobParameters()); + } + + @Test + public void testReader() throws Exception { + ExecutionContext executionContext = new ExecutionContext(); + executionContext.putInt("JdbcPagingItemReader.read.count", 2); + ((ItemStream)reader).open(executionContext); + assertNotNull(reader.read()); + } + +}