GAE, JDO: работа с объектами, загруженными из кеша

Я использую простой слой для загрузки и хранения сущностей по ключу или идентификатору, и я просто добавил кеширование в этот слой. Когда объект с данным ключом находится в кэше, скорее верните его, чем извлекайте из хранилища данных. И когда сущность обновляется и сохраняется в хранилище данных, слой просто устанавливает сущность в кэше на ноль. Это полностью прозрачно.

Кажется, что он работает нормально, однако объект, извлеченный из кэша, немного отличается от объекта, извлеченного из хранилища данных. Например, некоторые вещи перестали работать, и я не могу использовать.contains() для Collections внутри сущности, чтобы проверить, существует ли связь между двумя сущностями. Я также столкнулся со странным поведением, когда я загружал объект из кэша и сразу после этого сохранял в хранилище данных, все элементы в коллекциях, представляющих отношения, были заменены на nulls. Однако я не мог воспроизвести это. Теперь работает нормально.

Я не знаю, что происходит под капотом, поэтому вопрос в том, надежен ли этот способ работы с кешем? Можно ли работать с объектами, извлекаемыми из кэша, так же, как они были извлечены из хранилища данных (доступ к дочерним элементам, обновление, удаление...)?

1 ответ

Решение

Следует отметить две вещи:

  1. Все объекты, хранящиеся в Memcache, сериализуются / десериализуются, что означает, что их представление в памяти берется и изменяется в серию байтов (и наоборот).

  2. Collection.contains(object) использования object.equals(anotherObject) проверить, содержит ли коллекция определенный объект. По умолчанию Object.equals() только true если это точно такой же объект (= объект в той же ячейке памяти).

Учитывая, что: сериализация объекта и его десериализация никогда не создаст объект, который дает deserialisedObject.equals(originalObject) == true,

Если вам это действительно нужно, то вы должны переопределить .equals() (а также .hashCode()) в классе, который вы храните в Memcache, так что вы фактически сравниваете значимые значения внутри класса (= сравниваете значения всех полей).

Другие вопросы по тегам