четверг, 6 марта 2014 г.

Хранение объектов БД в памяти

В одном проекте появилась идея загрузить объекты из БД один раз, и работать с моделью домена в памяти, т.е. исключить постоянные запросы к БД. По необходимости выполнять сохранение данных в БД. По сути, в этом случае БД является просто хранилищем данных. В этом проекте в теории не могло быть больше двух клиентов, одновременная работа с одними и теми же данными тоже не должна была вестись. Так что идея вроде здравая. И использование методики разработки корпоративных приложений, когда хранение объектов в памяти клиентов может привести к рассогласованности с БД и нужно выполнять сохранение в БД как можно чаще, не требуется.
Но  оказалось, что при работе с ORM (qxorm) сложно обеспечить двустороннюю связь объектов на уровне указателей. Т.е. при наличии кода
MapPtr map(new Map());
qx::dao::fetch_by_id_with_relation("*->*->", map);
MapPtr mapFromRelation = map->programs().first()->map();

В результате map.data() не равен mapFromRelation.data(). Получается, что один объект может быть загружен несколько раз, и нельзя опираться на их идентичность на уровне указателей. Т.е. изменения атрибутов одного никак не повлияют на другого. И мы получим рассогласованность данных на GUI.
Была предпринята попытка добавить ленивую загрузку (lazy load) совместно с картой объектов (Identity Map). Но ничего конкретного не вышло, добавились другие проблемы: как  при удалении элемента очищать все зависимости из IM. К тому же не нравился подход к выборке коллекции объектов из IM, сначала приходилось выполнять запрос, затем искать в карте объектов и только после этого возвращать результат.

ps: при хранении в памяти всей модели предметной области для обеспечения целостности, чтобы не было проблем при сохранении со всеми реляциями предполагалось, что при добавлении/редактировании/удалении объектов будет обязательно выполняться метод validate().

Комментариев нет:

Отправить комментарий