Spring Batch: как лучше всего использовать данные, полученные за один шаг TaskletStep, при обработке другого шага
У меня есть работа, в которой: Первый шаг - TaskletStep, который извлекает некоторые записи (приблизительно 150-200) из таблицы базы данных в список.
Второй шаг извлекает данные из некоторой другой таблицы и требует список записей, извлеченных на предыдущем шаге для обработки.
Я натолкнулся на три способа сделать это: 1) поместить список, полученный на первом шаге, в StepExecutionContext, а затем продвинуть его в JobExecutionContext для обмена данными между шагами.
2) использование концепции кэширования Spring, т. Е. Использование @cacheable
3) программно положить список в ApplicationContext
Каков наилучший способ достичь этого (было бы лучше, если бы это можно было объяснить на примере), имея в виду две основные проблемы: увеличивается ли объем данных, полученных на первом этапе, и производительность
1 ответ
Помните, что объекты в контексте шага хранятся в базе данных, поэтому вы должны быть уверены, что объекты сериализуемы, и их действительно немного. Если вы уверены, поместите объекты в ваш jobExecutionContext (как решение 1.) или используйте держатель компонента ( Передача данных на следующий шаг); этот тип подхода действителен ТОЛЬКО, если данные на первом этапе - МАЛЕНЬКИЕ.
Иначе, вы можете обрабатывать данные на шаге 2 без их повторения на шаге 1, но легко управлять кешем данных шага 1 при обработке данных на шаге 2; таким образом, вам не нужен шаг 1, не нужно сохранять данные шага 1 в базе данных, но поиск данных шага 1 при обработке миллионов записей на шаге 2 не влияет на время обработки.
Я надеюсь, что я был ясен, английский не мой язык