Существует ли Java API для отслеживания изменений объектов/версионирования?

Я знаю как минимум два энхансера байт-кода, которые модифицируют «объектную модель» во время выполнения, чтобы обеспечить прозрачное выполнение транзакций.Один из них входит в состав Versant VOD, который я использую на работе каждый день, а другой — в состав Terracotta. Возможно, есть и другие, например, в ORM, но Versant позаботится об этом в моей компании.

У меня вопрос: существует ли такой API с открытым исходным кодом, который можно использовать сам по себе, независимо от продукта, для которого он был разработан? Можно сказать, «взламываемый» API. Он должен отслеживать только изменения, а не доступ для чтения, что значительно замедлит код. Другими словами, он не должен требовать явной блокировки чтения/записи. Для этого требуется либо доступ ко всем классам, выполняющим изменения, а не только к модели данных, либо требуется хранить в памяти некую форму «предыдущей версии» для проведения сравнения.

Проблема, которую я пытаюсь решить, заключается в том, что у меня есть «большие» (от 32 КБ до 256 КБ) графы объектов, которые «сериализованы» в (NoSQL) БД. Они долговечны и должны регулярно сериализоваться, чтобы иметь «историю» изменений. Но их сериализация довольно дорога, и большинство изменений незначительны.

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

Я нашел несколько вопросов, касающихся Apache Commons Beanutils для сравнения объектов, но это бесполезно для изменений на месте; Мне нужно было бы сделать полный клон модели между каждой «бизнес-транзакцией».

Повторюсь, я ищу API "в памяти" внутри той же JVM, который не использует какое-либо внешнее серверное приложение. API-интерфейсы, включающие собственный код, допустимы, если они доступны для Win, Mac и Linux. В настоящее время API не нужно упаковыватьнезависимо; просто должна быть возможность извлечь его из «родительского проекта», чтобы сформировать независимый API (лицензия родительского проекта должна разрешать это).

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

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

Лицензия API должна быть совместима с коммерческим использованием.

[EDIT] До сих пор я не получил полезногоответа, и похоже, что то, что я хочу, не существует. Это оставляет мне только один вариант: заставить это произойти. Я отправлю ссылку здесь в качестве ответа, когда у меня будет рабочая реализация, так как это следующий шаг в моем проекте, и я не могу двигаться вперед без него.

[EDIT] Я случайно нашел этот несколько связанный вопрос: Существует ли библиотека Java, которая может «различать» два объекта?

22
задан Community 23 May 2017 в 11:45
поделиться