From 8a3cda03c45a688cc77d16e915f6fc48f5ebfe36 Mon Sep 17 00:00:00 2001 From: dsyer Date: Mon, 21 Jul 2008 08:24:39 +0000 Subject: [PATCH] OPEN - issue BATCH-737: JdbcCursorItemReader will spin through entire resultset if numberOfProcessRows=0 --- .../item/database/JdbcCursorItemReader.java | 2 +- ...tDataSourceItemReaderIntegrationTests.java | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java index 328bf7f9f..eedf0d6a0 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java @@ -259,7 +259,7 @@ public class JdbcCursorItemReader extends AbstractBufferedItemReaderItemStream i private void moveCursorToRow(int row) { try { int count = 0; - while (rs.next()) { + while (count!=row && rs.next()) { count++; if (count == row) { break; diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java index 741ca940f..2872d54d7 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/AbstractDataSourceItemReaderIntegrationTests.java @@ -196,6 +196,36 @@ public abstract class AbstractDataSourceItemReaderIntegrationTests extends assertEquals(foo3, reader.read()); } + /** + * Rollback scenario with restart - input source rollbacks to last + * commit point. + * @throws Exception + */ + public void testRollbackOnFirstChunkAndRestart() throws Exception { + + getAsItemStream(reader).open(executionContext); + + Foo foo1 = (Foo) reader.read(); + + Foo foo2 = (Foo) reader.read(); + Assert.state(!foo2.equals(foo1)); + + Foo foo3 = (Foo) reader.read(); + Assert.state(!foo2.equals(foo3)); + + rollback(); + + getAsItemStream(reader).update(executionContext); + + // create new input source + reader = createItemReader(); + + getAsItemStream(reader).open(executionContext); + + assertEquals(foo1, reader.read()); + assertEquals(foo2, reader.read()); + } + public void testMultipleRestarts() throws Exception { getAsItemStream(reader).open(executionContext);