Как построить систему отслеживания изменений, а не систему аудита - PullRequest
1 голос
/ 16 августа 2010

У меня есть требование, при котором мне нужно регистрировать изменения данных (не проверяя) и состояния жизненного цикла при инвентаризации.

Технология: Jave, Oracle, Hibernate + JPA

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

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

Таблица будет выглядеть примерно так:


Table Name: ATL_CHANGE_TRACKER  
Key  columns  
INVENTORY_ID          Inventory Id of the vehicle
SALEEVENT_ITEM_ID     SaleEvent item of the vehicle
FIELD_CHANGED_ID      Id of the field that got changed or action. Link to subscription
UPDATE_DTM            Indicates the date time when change occured.

Для данного инвентаря у нас может быть до 200записей в этой таблице (мониторинг 200 полей во многих таблицах).

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

Определите список доступных полей / действий


Table Name: ATL_FIELD_ACTION  
Key columns  
ID  
NAME                    Name of the field/action - Example Color,Make
REC_CRE_TIME_STAMP  
REC_CRE_USER_ID  
LAST_UPDATE_USER_ID  
LAST_UPDATE_TIME_STAMP  

Таблица подписки, если сторонняя компания xyz заинтересована в 60поля, 60 полей будут сопоставлены с этой таблицей.


ATL_FIELD_ACTION_SUBSCRIPTION  
Key columns  
ATL_FIELD_ACTION_ ID      ID of the atl_field_action table
CONSUMER                  3rd Party Name
FUNCTION                  Name of the 3rd Party Transmission that it is used for
STATUS  
REC_CRE_TIME_STAMP  
REC_CRE_USER_ID  
LAST_UPDATE_USER_ID  
LAST_UPDATE_TIME_STAMP  

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

Опять же, демон будет подписан на эти состояния и соберетте, в которых он заинтересован.

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

Интересно, кто-нибудь сделал что-то подобное - какие-то ошибки - с полки - решения с открытым исходным кодом, чтобы сделать это.

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Для обсуждения на высоком уровне по этой теме я бы предложил прочитать эту статью Мартина Фаулера.

Звучит так, как будто у вас есть данные с однократной записью и многократным чтением, они могут создавать большие объемы данных, и данные для разных клиентов различны.Если вы спросите меня, похоже, что это может быть хорошим местом для использования базы данных NOSQL или взлома базы данных Oracle для работы в качестве базы данных NOSQL.См. здесь для обсуждения того, как кто-то сделал это с MySQL.

В противном случае, вы можете посмотреть на создание «неизменяемой» таблицы базы данных и иметь Hibernate для записи новых записей при каждом обновлениикак описано здесь .

1 голос
/ 17 августа 2010

Пара вещей.

Во-первых, вы можете выполнить всю эту работу самостоятельно.Слушатели жизненного цикла JPA / Hibernate, хотя у них есть событие, когда происходит обновление, не передают «старый» объект и «новый» объект.Итак, вам придется отслеживать, какие поля меняются, используя какой-то другой метод.

Во-вторых, опять же со слушателями жизненного цикла, будьте осторожны внутри них, так как состояние транзакции немного мутное.По крайней мере, на Glassfish / EclipseLink у меня были «странные» проблемы с использованием JPA или JMS из прослушивателя жизненного цикла.Просто странное поведение.Мы пошли в нетранзакционную очередь, чтобы собрать всю нашу информацию, которую мы отслеживаем из событий жизненного цикла.

Если допустимо иметь данные об изменениях, зафиксированные в его собственной транзакции, то есть значение, что данные передаютсяв более быструю внутреннюю очередь (которая может передать слушателю, который отправляет его в MDB).Это просто делает аудит «вне диапазона» с вашей транзакцией, обеспечивая вам лучшую пропускную способность транзакции.Но если вам необходимо зафиксировать информацию об изменениях в одной транзакции, это не сработает.Например, вы могли бы поместить что-то в очередь, и тогда транзакция может быть откатана (по любой причине), оставив изменение в очереди, показывающее, что это произошло, когда это фактически не удалось.Это потенциальная проблема с этим.

Но если вы публикуете много информации аудита, то это может быть проблемой.

Если информация аудита имеет короткий срок службы (относительнок остальным данным), тогда вам, вероятно, следует приложить усилия для отбраковки таблиц аудита, они могут стать довольно большими.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...