Как читать данные из Oracle Db, используя JdbcCursorItemReader с многопоточностью - PullRequest
0 голосов
/ 27 декабря 2018

У меня было приложение Spring Batch и настроенный шаг, подобный этому:

ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(4);
taskExecutor.setMaxPoolSize(10);
taskExecutor.afterPropertiesSet();
return this.stepBuilderFactory.get("step1")
            .<Mymodel, Mymodel>chunk(2500)              
            .reader(reader())
            .writer(writer())
            .taskExecutor(taskExecutor)
            .build();

И читатель, подобный этому:

@Bean
public JdbcCursorItemReader<Mymodel> reader() {
    JdbcCursorItemReader<Mymodel> reader = new JdbcCursorItemReader<Mymodel>();
    reader.setDataSource(dataSource);
    reader.setSql("select * from User");
    reader.setRowMapper(new BeanPropertyRowMapper<>(Mymodel.class));
    reader.setVerifyCursorPosition(false);
    return reader;
}

Когда я запускаю приложение, получаю эту ошибку:

org.springframework.jdbc.UncategorizedSQLException: попытка обработать следующую строку не удалась;неквалифицированное исключение SQLException для SQL [выбрать * из пользователя];Состояние SQL [99999];код ошибки [17289];Результат устанавливается после последней строки;Вложенное исключение - java.sql.SQLException: результат установлен после последней строки

Не могли бы вы помочь мне решить эту проблему.

1 Ответ

0 голосов
/ 29 декабря 2018

JdbcCursorItemReader является не поточнобезопасным , поскольку оно оборачивает ResultSet объект, который не является поточно-ориентированным.

Вы можете использовать JdbcPaginingItemReader, который являетсяпотокобезопасный и при необходимости настройте размер страницы в соответствии с размером чанка, чтобы каждая страница обрабатывалась в одном потоке.

Подробнее в следующем ответе: https://stackoverflow.com/a/28724199/5019386.

Надеюсьэто помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...