Вопросы по управлению транзакциями

Я пытаюсь реализовать бизнес-потребность с помощью Spring и испытываю некоторые проблемы с управлением транзакциями.

Бизнес-потребность заключается в том, чтобы просто
1) запросить базу данных (№1) с некоторыми критериями.
2) Запишите результаты запроса в плоский файл.
3) Обновите эти записи в базе данных (№1) как «обработанные».
4) Вставьте записи в другую базу данных (# 2) в результате первых трех шагов.

Мне нужно, чтобы эти 4 шага были простыми. Например, если на 4-м шаге произошел сбой, последний элемент, записанный в плоский файл на 2-м шаге, должен быть откат. Я нашел "Диспетчер файловых ресурсов Apache Commons" для реализации механизма отката с файлами.

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

Думаю, мне нужен общий совет об этом проекте и о том, следует ли использовать Spring Batch для этой цели. Кроме того, стоит ли попытаться реализовать эти потребности в параллельной среде, поскольку механизм отката будет довольно сложным для этого стиля.


person Kivanc    schedule 03.03.2011    source источник


Ответы (2)


Цель пакетной обработки - разбить то, что вы пытаетесь сделать, на небольшие единицы работы, которые можно обрабатывать индивидуально (последовательно или параллельно). Пакетная обработка Spring - это платформа, которая предоставляет вам гибкий механизм, построенный на основе Spring, который позволяет выполнять пакетную обработку стиля. В зависимости от ваших требований вы можете настроить пакет Spring для выполнения разными способами. Упомянутая вами обработка, ориентированная на фрагменты, - это всего лишь один из способов использования пакета Spring.

Если я посмотрю на предоставленную вами информацию, то вот элементы вашего приложения, как я их вижу:

  • читать записи из базы данных, которые необходимо обработать
  • обрабатывать записи, что приводит к обновлению db # 2
  • отмечать записи как обработанные
  • записать запись в обработанный файл

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

  1. Получить записи из базы данных для обработки. Извлечение будет выполняться с помощью специальной программы извлечения из базы данных. Эти записи будут использоваться Spring Batch в качестве селектора записей. Затем вы должны настроить пакет Spring для перебора этого списка.
  2. Вы должны сконфигурировать следующий шаг пакета Spring для обработки каждой из записей, полученных на шаге 1. Эта обработка будет состоять из обработки отдельной записи и записи результатов во вторую базу данных.
  3. Ваш последний шаг - завершить обработку отдельной записи. Как и в большинстве фреймворков Spring, существует множество различных способов настройки, когда это происходит. Этот последний шаг будет выполнять две функции: обновлять запись в базе данных №1 как обработанную и записывать обработанную запись в выходной файл. Запись выходного файла может быть выполнена как шаг 4 по завершении общего пакетного процесса, где вы должны просмотреть записи, отмеченные как обработанные во время текущего прогона, и записать данные по мере необходимости.

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

При таком подходе вы можете обрабатывать записи последовательно, параллельно и т. Д. Однако все это предполагает, что вы можете разбить данные на более мелкие единицы работы. Если это не так, то пакетная обработка на самом деле не может быть выполнена, поскольку у вас есть только один процесс.

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

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

person Kris Babic    schedule 03.03.2011
comment
Большое тебе спасибо. Прочитал ваш подробный ответ и у меня есть вопросы. Вы четко разбили бизнес-проблему на 4 этапа. Вы говорите о ключевом слове spring batch step? Или, может быть, вы прямо не говорили о весенних пакетных шагах, и это были всего лишь части атомарной транзакционной операции, и я упустил суть ?? - person Kivanc; 08.03.2011
comment
Есть несколько способов реализовать эту функцию. Один из способов - рассматривать их как отдельные шаги Spring Batch, где шаги будут: (1) выбрать записи (2) обработать записи (3) записать в базу данных №2, обновить записи как обработанные и сгенерировать файл. Вам нужно будет немного поработать, чтобы сделать все шаги автономными. Другой способ - использовать шаг по частям со следующими функциями (считыватель) выбор записей (процессор) записи процесса (писатель) запись файлов в базу данных №2, пометка как обработанная, вывод в файл. Упомянутые мной шаги - это группы, которые соответствуют идеям весенней партии. - person Kris Babic; 09.03.2011

Я бы сказал, что Spring способ сделать это - реализовать версию PlatformTransactionManager абстракция Spring, которая задерживает запись в файл до тех пор, пока транзакция не будет зафиксирована. Не должно быть слишком сложно.

person Sean Patrick Floyd    schedule 03.03.2011
comment
Спасибо за ваш ответ. Вы рекомендуете не использовать Spring Batch? Я думаю, что обработка, ориентированная на фрагменты, обычно полезна для таких случаев, как перенос только некоторых данных из таблицы базы данных в файл и наоборот. Однако в моей ситуации я бы хотел выполнить дополнительные задачи, такие как вставка данных в другую таблицу. - person Kivanc; 03.03.2011