2015-03-21 3 views
0

Пусть У меня есть CDI боб, который нуждаетсяУправляемые транзакции CDI с длинными операциями

  1. нагрузки некоторые JPA Entities
  2. ли длинные операции ввода-вывода с тем, что JPA сущностей (то есть. Веб-вызов услуги)
  3. Update некоторые из субъектов JPA с результатами -2-

Каков наилучший шаблон, если я хочу избежать длительной транзакции во время операций ввода-вывода? Я знаю, что я могу использовать @Transactional (Transactional.TxType.REQUIRES_NEW) в -2-, но для моего понимания транзакция, открытая в -1, будет приостановлена.

До знаю, я использовал старый JBoss 4 с не управляемым контейнером транзакциями, и я имел обыкновение делать:

  1. Создать EntityManager без открытия новой транзакции
  2. нагрузки JPA лица (не открыла ни одной сделки)
  3. Do операции ввода-вывода, то есть (вызов внешнего WebService)
  4. Открыть транзакцию, обновить JPA объекты, закройте сделку

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

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

EDIT Ответ @Alexander Langer является хорошим вариантом для некоторых случаев. Но я также хотел бы знать альтернативу делать это без работы, если это возможно. Поскольку точка -2- (длительная операция ввода-вывода) может быть простым вызовом внешнего WS, необходимого для обслуживания запроса.

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

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

+1

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

ответ

1

Посмотрите на Java EE Batch Processing, представленный в Java EE 7. Именно то, что вы ищете.

+0

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

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