Fix multi-threaded empty read for JdbcPagingItemReader

On empty input, the JdbcPagingItemReader cannot derive
a start value for the sort key to be used in further
queries. For multi-threaded steps, it is thus necessary
to prevent the reader from trying to read further pages
if the first page is empty.

Issue #3898
This commit is contained in:
Henning Pöttker
2021-07-03 00:37:25 +02:00
committed by Mahmoud Ben Hassine
parent e422f59dc9
commit 78ddf44730
6 changed files with 94 additions and 36 deletions

View File

@@ -19,7 +19,7 @@ package org.springframework.batch.item.database;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -179,7 +179,6 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
}
@Override
@SuppressWarnings("unchecked")
protected void doReadPage() {
if (results == null) {
results = new CopyOnWriteArrayList<>();
@@ -190,7 +189,7 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
PagingRowMapper rowCallback = new PagingRowMapper();
List<?> query;
List<T> query;
if (getPage() == 0) {
if (logger.isDebugEnabled()) {
@@ -211,7 +210,7 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
}
}
else {
else if (startAfterValues != null) {
previousStartAfterValues = startAfterValues;
if (logger.isDebugEnabled()) {
logger.debug("SQL used for reading remaining pages: [" + remainingPagesSql + "]");
@@ -225,9 +224,11 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
getParameterList(parameterValues, startAfterValues).toArray());
}
}
else {
query = Collections.emptyList();
}
Collection<T> result = (Collection<T>) query;
results.addAll(result);
results.addAll(query);
}
@Override