2014-01-27 3 views
1

У меня есть партия, которая делает следующие операцииПараллельная обработка в Спринг партии

Шаг 1: Чтение из базы данных с помощью хранимой процедуры и записи в несколько файлов, используя MultiResourceItemWriter

Шаг 2: Чтение файлов с помощью MultiResourceItemReader, выполняя некоторую обработку и запись в другую базу данных. Этот шаг распараллеливается с использованием MultiResourcePartitioner

Теперь для лучшей производительности я хочу распараллелить шаги 1 и 2, так что, как только запись файла будет завершена на шаг 1, шаг 2 возьмет этот файл и начнет обработку. Какой был бы лучший способ достичь этого. Я не могу найти подходящий способ узнать, когда запись файла завершена, поэтому я выполняю некоторую операцию, например, переименовать/переместить файл, чтобы его можно было отобрать на втором шаге.

+1

Почему бы вам не читать, обрабатывать и писать за один шаг. Используя Partitioning, вы можете читать данные с 1 до 1000 подчиненных шагов и обрабатывать их и печатать их в базе данных. аналогично на другом подчиненном этапе 1001-2000 и так далее. Поэтому накладные расходы на File IO могут быть устранены. Сложность заключается в формировании запроса. Вы можете ссылаться на pageitemreader http://docs.spring.io/spring-batch/2.0.x/reference/html/readersAndWriters.html, как он читает данные в кусках, этот запрос должен быть частью разделителя –

+0

Я решил создать файл becasue. Я модифицировал некоторые данные, которые выбираются на шаге 1, как часть шага 2. Если я не использую файлы, я должен поддерживать открытое соединение db, пока все прочитанные завершено, и я не могу обновить его, поскольку есть блокировка этих записей в БД. Надеюсь, что это ясно. – slowhandblues

+0

Вы можете создать Itemprocessor для изменения данных (следовательно, это не повлияет). Я не думаю, что ваша блокировка на всей таблице (я полагаю, ваша бизнес-логика считывает данные из процесса tableA и обновляет данные до таблицыA). блокировка применяется только к строке, которую вы читаете. Вы можете исключить SP. –

ответ

0

Шаг 1 не нужен. Как упоминалось в @KaPra, вы можете использовать Partitioner для разделения записей db в зависимости от диапазона.
ColumnRangePartitioner может работать в вашем случае, иначе пользовательский разделитель, который будет определять диапазон записей для хранения в stepExecutionContext, чтобы затем использовать их для чтения с использованием JdbcCursorItemReader или чего-то подобного для каждого раздела.
Результат будет таким же, как и текущее задание, минус узкое место создания файлов, а затем обрабатывать их.

+0

Я решил создать файл becasue. Я модифицировал некоторые данные, которые выбираются на шаге 1, как часть шага 2. Если я не использую файлы, я должен поддерживать открытое соединение db, пока все чтение завершено, и я не могу обновить его, так как есть блокировка этих записей в БД. Надеюсь, что это понятно – slowhandblues

Смежные вопросы