2015-01-10 2 views
0

Я не могу доработать, применима ли рамка Spring Batch для нижеследующего требования. Мне нужны эксперты.Spring Batch Framework

Ниже мое требование:

Считывание нескольких таблиц Oracle (по крайней мере, 10 таблиц, включая как сделки и мастер), сделать сложный расчет на основе бизнес-правил, Insert/Update/Delete записи в транзакции столы.

я определил следующие два проекта:

Design # 1:

ItemReader: Выбор подходящих записей из ключей таблицы транзакций.

ItemProcessor:. Fetch дополнительные данные из БД с помощью клавиши доступны в записи, возвращаемые ItemReader (Это потребовало бы multipble транзакций DB) Выполните проверку и вычисление и добавить детали должны быть записаны в БД как объекты список.

ItemWriter: Написать детали доступны в объектах с использованием CustomItemWriter (вставка/обновление/удаление операции)

С помощью этой конструкции, мы можем достичь параллельной обработки но увеличить количество DB сделок.

Дизайн # 2:

Шаг № 1

ItemReader: Использование Composite Item Reader (Группа ItemReaders) читать все необходимые таблицы.

ItemWriter: Сохранить результирующие наборы как списки объектов (один список в таблице) в контексте выполнения

Шаг № 2

ItemReader: Получить списки объектов, доступных в контексте выполнения и группировать их в один список объектов на основе бизнес-обработки, чтобы процессор мог их обрабатывать.

IremProcessor: Обработать кусок объектов, возвращаемых ItemReader. Сделайте проверку и вычисление и добавьте детали, которые будут записаны в DB как объекты в списке.

ItemWriter: Написать детали, доступные в объектах с использованием CustomItemWriter (вставка/обновление/удаление операции)

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

Просьба сообщить, возможно ли это, используя SpringBatch, или нам нужно использовать обычную программу Java.

+0

Не храните все в контексте выполнения, поскольку оно сериализуется в хранилище, используемое для хранения деталей выполнения. Рядом с тем, что чтение всего в памяти не очень умное, поскольку вы в конечном итоге столкнетесь с проблемами памяти. Что не так с большим количеством tranactions, поскольку это дает вам еще больший контроль и возможность перезапуска с определенной точки (т.е. там, где она не удалась). –

+0

У нас будет база данных OLTP, которая будет использоваться веб-приложениями (приложениями) и такими партиями. Эти партии должны обновлять таблицы транзакций, используемые веб-приложениями (приложениями) чаще. Поскольку мы не можем контролировать транзакции в Интернете, мы планируем сократить количество пакетных транзакций, чтобы избежать перегрузки OLTP DB. – Vijay

+0

Операции должны быть достаточно маленькими, чтобы не вызывать (что сильно) проблемы для вашего OLTP. Если вы выполняете длительную транзакцию, вы получаете блокировку в течение очень большого количества времени, что гарантированно затруднит ваш онлайн-процесс. –

ответ

0

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

Spring-batch объединяет объекты, подобные JCL и ISPF, из мэйнфрейма в контекст java.

Весенняя партия представляет собой основу для организации и управления границами вашего процесса. Это естественно для многих операций ETL и bigdata, но это не единственный способ написать эти процессы.

Если процесс обрабатывается, можно разделить его на несколько шагов, а весенняя партия - хороший выбор для вас.

Itemreader должен (logicalall) быть итератором, возвращающим один объект, представляющий начало одной логической единицы работы (luw). Объект luw захватывается чанкером и собирается в коллекцию заданного вами размера, а затем передается процессору. Результат процессора затем передается автору. В контексте процесса, ориентированного на РСУБД, фиксация происходит в конце работы автора.

Что происходит в каждой из этих частей шага - это 100%, что вам нужно (простая старая java). Цель этой рамки - освободить вас от сложности и позволить вам решить проблему.

+0

Позвольте мне предоставить больше представление о моей проблеме У меня есть следующие таблицы 1.CustomerOrder (транзакция) 2.CustomerOrderLineItem (сделки) 3.CustomerOrderHistory (сделки) 4.Продукт (мастер) 5. Производитель (мастер) 6.VendorProductPriceDefinition (master) Давайте рассмотрим, что требование заключается в вычислении цены для всех новых заказов в течение часа. Моя работа должна запускаться ежечасно. Мне нужно написать весеннее пакетное задание с приведенным ниже рисунком ** ItemReader: ** Прочитать новую запись заказа из таблицы заказов. – Vijay

+0

** ItemProcessor: ** Вычислить цену для выбранной записи CustomerOrder. Для получения информации о параметрах LineItem, Product, Vendor, VendorPrice необходимо сделать несколько вызовов БД. ** ItemWriter: ** Обновить расчетную цену для записи, выбранной в таблице CustomerOrder. ** Преимущество: ** Мы можем использовать параллельную обработку, предоставляемую SpringBatch. ** Недостаток: ** Каждому потоку ItepProcesser необходимо выполнить вызовы чтения БД. – Vijay

+0

** ItemReader **: при запуске прочтите корневую запись для всех клиентов CustomerOrder, которые не были обработаны с момента последнего вызова во внутренней коллекции, и создает экземпляр итератора. При каждом вызове читатель возвращает один объект CustomerOrder. ** Процессор ** делает все возможное, чтобы вычислить цену, - используйте (любой) продукт кеширования для ограничения обращений к базе данных. ** ItemWriter **: обновить цену по заказу клиента. –

0

С моей точки зрения, весенняя партия не имеет ничего общего с операциями пакетной обработки базы данных (или, по крайней мере, слово «пакет» имеет другое значение в этих двух контекстах.) Весенняя партия используется для создания процессов с несколькими шагами и дает вам возможность перезапустить процесс, если один из шагов процесса завершился неудачно (без повторения ранее завершенных этапов процесса.)