2013-03-19 3 views
2

Я не уверен, что для этого варианта использования существует нечто особенное - но это было похоже на случай, когда кто-то, вероятно, сделал какую-то полезную структуру/технику/дизайн-шаблон.Структура данных/Java-технология для управления списком последовательных команд

Моей ситуация

  • У меня есть набор команд SQL, выполненные из среднего уровня (Java) для вставки/обновления/удаления данных на любой из множества очень больших таблиц с помощью объединений из родственных промежуточная таблица.

  • У меня есть больше команд SQL, которые обновляют различные производные таблицы на основе промежуточной таблицы/фактического содержимого таблицы. Различные таблицы будут взаимодействовать с различными производными таблицами через разные запросы (как обычно). Эти команды могут чередоваться с первым набором в зависимости от варианта использования - поэтому я не могу выполнить набор 1, а затем установить 2 сразу.

Мой вопрос

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

Кто-нибудь знает стандартный способ кодирования этого? Я уверен, что кто-то, переходящий от кода хранимой процедуры к коду среднего уровня, сделал это раньше, и я не хочу изобретать велосипед, если есть хорошие варианты.


Дополнительная информация

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

  • усечь постановка таблицы А «и заполнить его с первичными ключами, направленных на удаление записей
  • Удалить из реальной таблицы А на основе присоединиться к A»
  • Округление постановка таблица а «и заполнить его с полными данными для upserts
  • Update/Вставка записей из» в к а на основе присоединяется

Та же логика применяется к таблицам B, C, D, и т.д. . К сожалению, это может быть случай, когда только A и C требуется дополнительный шаг, например синхронизация удалений с определенной производной таблицей, которая должна выполняться после удаления, но до восходящих.

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

+0

Вы спрашиваете только о том, как сделать ваш код транзакционным, а также о шаблоне для заказа работы на основе динамических зависимостей/условий? – ach

+0

Я уже реализовал его, и его транзакционные/отлично работают. Это зависимости (между группами команд), которые мне интересны в управлении лучше. –

+0

Похоже, вам нужна какая-то реализация графа. [Этот вопрос] (http://stackoverflow.com/questions/6749255/directed-graph-processing-in-java), похоже, похож на ваш - он предлагает [JGraphT] (http://www.jgrapht.org /). – ach

ответ

3

Не пишите такую ​​вещь самостоятельно. Для этого родилось JTA.

Для этого вы можете использовать либо JPA, либо Spring.

Аннотировать блок работы как транзакционный и позволить базе данных и JDBC обрабатывать его.

Если вы должны сделать это самостоятельно, следуйте аспектно-ориентированному подходу и сделайте его декоративным »перед & после« реализации ».

+0

командный шаблон, запущенный внутри некоторой среды, поддерживающей JTA, - это то, как я сам это сделаю. каждая команда в вашей последовательности либо успешно, либо не удалась, и JTA позаботится о транзакции. различные команды регистрируются в JTA для уведомления о событиях TX (успех/сбой) и действуют соответственно. – radai

+0

Могу ли я использовать JTA, если моя целевая база данных не поддерживает XA? –

+0

XA означает двухфазную фиксацию; одна база данных сама по себе не нуждается. – duffymo