Как получить / установить запрос SQL для ItemReader из базы данных? - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть программа Spring Batch, которая считывает данные из БД, обрабатывает их и вставляет (используя ItemWriter) в другую таблицу в базе данных.Здесь я использую кучу SQL-запросов для ItemReader, ItemProcessor и ItemWriter.

Мое требование - хранить все эти запросы в таблице с форматом параметров и значений, получать их одним вызовом БД и передавать их ItemReader.или ItemProcessor или ItemrWriter.Так что, если в будущем произойдут какие-либо изменения в запросах, мы в конечном итоге будем выполнять только обновления БД, и код останется нетронутым.

Я пытался сделать это в разделе beforeJob, но столкнулся с ошибкой, говоря: «Java.lang.IllegalArgumentException: SQL-запрос должен быть предоставлен ".Но я могу сделать это успешно, сделав вызов БД внутри метода ItemReader.Я пытаюсь избежать такого подхода, потому что мне нужно сделать вызов БД для каждого ItemReader, ItemProcessor и ItemWriter.Пожалуйста, дайте мне знать, как этого добиться?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

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

1.Получите запрос и поместите его в контекст выполнения:

@Bean
public Tasklet queryRetrievalTasklet() {
    return (contribution, chunkContext) -> {
        String query = ""; // retrieve query from db (using a JdbcTemplate for example)
        chunkContext.getStepContext().getJobExecutionContext().put("query", query);
        return RepeatStatus.FINISHED;
    };
}

2.Сконфигурируйте читателя с запросом из контекста выполнения

@Bean
@StepScope
public ItemReader<Integer> itemReader(@Value("#{jobExecutionContext['query']}") String query) {
    // return your reader configured with the query
    return null;
}

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

0 голосов
/ 23 апреля 2019

По моему мнению, такая конфигурация обычно выполняется для хранения запросов в свойствах, а не в базе данных.Нравится:

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