У меня есть приложение, которое получает данные из базы данных (Mongo), когда пользователь подключается, и сохраняет его, когда пользователь отключается и через определенные промежутки времени уменьшает вероятность потери данных, если сервер опускается. Я использую объекты доступа к данным для сохранения пользователей в базе данных, которая обновляет каждое поле независимо от того, было ли оно изменено. Это может привести к проблемам, например, когда пользователь присоединяется к нескольким серверам и вносит изменения в один из них, но изменения перезаписываются, когда пользователь отключается от другого.
Существуют ли какие-либо установленные способы сохранения только модифицированных полей или любых структур, которые это делают? Я бы предпочел не использовать логическое для каждого поля, так как у меня есть много полей внутри объекта User
и добавление грязного флага в каждый из них значительно увеличит размер класса.
Шаги, выполняемые вашим приложением:
Пользователь получает данные от MongoDB
Эти данные частично изменены
Изменения должны быть сохранены
Это означает: часть вашего приложения, которая модифицирует данные, должна позаботиться об этом.
Команда Spring представляет несколько инструментов Diff, несколько месяцев назад: https://spring.io/blog/2014/10/22/introducing-spring-sync
Используя это, вы получите объект Patch, который содержит только изменения.
Patch patch = Diff.diff(original, modified);
Вот такой подход, который мог бы работать:
Object data = mongoClient.getData();
Object modifiedData = modify(data);
Patch patch = Diff.diff(data, modifiedData);
patch
теперь содержит все, что изменилось. Теперь вы должны каким-то образом использовать внутренности объекта Patch и сопоставить его с командами MongoDB $set
.