GAE, JDO: работа с объектами, загруженными из кеша
Я использую простой слой для загрузки и хранения сущностей по ключу или идентификатору, и я просто добавил кеширование в этот слой. Когда объект с данным ключом находится в кэше, скорее верните его, чем извлекайте из хранилища данных. И когда сущность обновляется и сохраняется в хранилище данных, слой просто устанавливает сущность в кэше на ноль. Это полностью прозрачно.
Кажется, что он работает нормально, однако объект, извлеченный из кэша, немного отличается от объекта, извлеченного из хранилища данных. Например, некоторые вещи перестали работать, и я не могу использовать.contains() для Collections внутри сущности, чтобы проверить, существует ли связь между двумя сущностями. Я также столкнулся со странным поведением, когда я загружал объект из кэша и сразу после этого сохранял в хранилище данных, все элементы в коллекциях, представляющих отношения, были заменены на null
s. Однако я не мог воспроизвести это. Теперь работает нормально.
Я не знаю, что происходит под капотом, поэтому вопрос в том, надежен ли этот способ работы с кешем? Можно ли работать с объектами, извлекаемыми из кэша, так же, как они были извлечены из хранилища данных (доступ к дочерним элементам, обновление, удаление...)?
1 ответ
Следует отметить две вещи:
Все объекты, хранящиеся в Memcache, сериализуются / десериализуются, что означает, что их представление в памяти берется и изменяется в серию байтов (и наоборот).
Collection.contains(object)
использованияobject.equals(anotherObject)
проверить, содержит ли коллекция определенный объект. По умолчаниюObject.equals()
толькоtrue
если это точно такой же объект (= объект в той же ячейке памяти).
Учитывая, что: сериализация объекта и его десериализация никогда не создаст объект, который дает deserialisedObject.equals(originalObject) == true
,
Если вам это действительно нужно, то вы должны переопределить .equals()
(а также .hashCode()
) в классе, который вы храните в Memcache, так что вы фактически сравниваете значимые значения внутри класса (= сравниваете значения всех полей).