Есть ли способ зафиксировать все изменения в спящем режиме, сгруппированные по транзакциям? - PullRequest
0 голосов
/ 23 октября 2019

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

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

Я уже использую envers для создания аудитов и использую пользовательский класс ревизий для добавления полей в запись REVINFO, если это помогает.

Есть лиМеханизм гибернации, который мне не хватает, поможет мне в этом?

РЕДАКТИРОВАТЬ:

Что я на самом деле пытаюсь сделать: после завершения транзакции (надеюсь, вызвано spring / hibernate / envers), перебираем все сделанные модификации (я полагал, что envers может предоставить это через свои события, я счастлив записать их где-нибудь под ключом transaction ID), а затем напишите сводку того, что было изменено на SQS.

1 Ответ

1 голос
/ 30 октября 2019

Учитывая, что вы используете Envers, я бы на самом деле решил полностью отделить этап создания отчета от текущего приложения. Это дает вам несколько преимуществ:

  • Транзакции Hibernate не будут включать в себя больше шагов, чем необходимо, поэтому они фиксируются быстрее.
  • Разделение задач, генерация отчетов полностью независима.
  • Логика повторов становится проще благодаря механизму опроса / нажатия.

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

В следующем объясненииЯ собираюсь предположить, что опрос / толчок делается в отдельном приложении. Идея состоит в том, что в это отдельное приложение включены сопоставления сущностей приложения (или, по крайней мере, те, которые представляют интерес).

Во-первых, я хотел бы предложить, чтобы отображение редакции-сущности для REVINFO также отслеживало измененные типы сущностей. Это будет очень полезно позже при создании отчета, потому что мы можем взять тип объекта в сочетании с номером ревизии и выбрать ревизии на основе этого.

Во-вторых, отдельное приложение предназначено для отслеживания последнегономер ревизии обработан. Каждый раз, когда запускается последовательность опроса / отправки, приложение будет видеть, есть ли какие-либо новые ревизии, и если это так, оно будет их обрабатывать;в противном случае он будет ждать, а затем опросить снова.

Общая идея концепции будет такой:

  1. Получить все экземпляры объекта ревизии с момента последнего номера ревизии
  2. Итерациякаждая редакция-сущность и ...
    • Для каждого типа сущности, измененного в редакции, извлекать изменение по номеру редакции сущности-редакции
    • Для каждого типа сущности, измененного в редакции, извлекать редакциюprior
    • Выполните diff двух экземпляров Java (используя что-то вроде JaVers и т. д.)
  3. После того, как все различия записаны, отправьте отчет в SQS
...