2014-12-12 6 views
1

У меня есть пакетное задание Spring, чтобы получить несколько строк данных из базы данных, чтобы что-то сделать.Весенняя партия rowNum не увеличивается

Я хочу что-то сделать в первом ряду в RowMapper.

public myVO mapRow(ResultSet rs, int rowNum) throws SQLException { 
    System.out.println("rowNum is " + rowNum); 
    if (rowNum == 1) { 
     // do something 
    } 
    // some other code here 
} 

Это нормально для меня. Однако после того, как я добавлю в scope="step" в свой пакетный xml-файл в части читателя, rowNum всегда будет 0 вместо начала 0 и увеличиваться.

Любой способ исправить это, пока я хочу поддерживать scope="step".

+0

Я не думаю, что проблема вызвана степенью охвата. Может быть, попытаться сделать минимальную работу, которая может воспроизвести проблему и опубликовать ее здесь? –

+0

Я попытался удалить 'late-binding'' scope = "step" ', а' rowNum' снова работает. Затем я вернул его, 'rowNum' отображал отображение 0 в' System.out.println(); ' –

+0

Можете ли вы поместить свой SQL-запрос здесь? У вас есть предложение where, в котором значения изменяются в этих сценариях. – kamoor

ответ

2

Смысл Scope = «step» заключается в том, что он создает экземпляр для каждого этапа выполнения, что означает, что у вас будет новый экземпляр для каждого потока.

Так что должно произойти, как только вы определите область действия «шаг», строка карты вызывается новым экземпляром вашего процессора и имеет начальное значение 0. Далее указывается, когда вы говорите, что оно работает правильно когда вы удаляете область шага.

Так что вы можете сделать это, сохранить статическое атомное целое (Thread safe) и полагаться на этот счетчик для своей логики, а не полагаться на rowNumber.

Если это не имеет смысла, поделитесь своей конфигурацией и для дальнейшего анализа. Благодарю.

+0

О, почему я никогда не думаю о статике. Я продолжаю объявлять нормальное целое число, и это не работает. –

+0

Всегда заботитесь о безопасности потока. Статические переменные не являются потокобезопасными, поэтому ищите синхронизацию или используйте атомную переменную типа AtomicInteger. –

1

Если вы хотите сохранить scope="step" и хотите грести подсчет не используйте RowMapperrowNum свойства, но пусть myVO объекта реализует ItemCountAware и делегат SB ответственности, чтобы установить номер текущего элемента.