From e338f24233fd403c48d0773e21705cc311cddbd3 Mon Sep 17 00:00:00 2001 From: dsyer Date: Mon, 21 Jul 2008 08:27:40 +0000 Subject: [PATCH] RESOLVED BATCH-737: JdbcCursorItemReader will spin through entire resultset if numberOfProcessRows=0 --- .../item/database/JdbcCursorItemReader.java | 5 +--- ...tDataSourceItemReaderIntegrationTests.java | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) 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 aa19ac69d..6bfb37f3c 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,11 +259,8 @@ public class JdbcCursorItemReader extends AbstractBufferedItemReaderItemStrea private void moveCursorToRow(int row) { try { int count = 0; - while (rs.next()) { + while (row!=count && rs.next()) { count++; - if (count == row) { - break; - } } } catch (SQLException se) { 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 60a178063..c30e64804 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);