gpt4 book ai didi

java - GAE,JDO : working with entities loaded from cache

转载 作者:行者123 更新时间:2023-11-29 05:56:15 25 4
gpt4 key购买 nike

我使用简单层通过键或 ID 加载和存储实体,我只是将缓存添加到该层。当具有给定键的实体在缓存中时,返回它而不是从数据存储中获取。当实体更新并保存到数据存储时,该层只是将缓存中的实体设置为空。它是完全透明的。

它似乎工作正常,但是从缓存中获取的对象与从数据存储中获取的对象略有不同。有些东西停止工作,例如,我不能在实体内部的集合上使用 .contains() 来检查两个实体之间是否存在关系。我还遇到了一个奇怪的行为,当我从缓存中加载一个对象并在该对象存储到数据存储之后立即将表示关系的集合中的所有项都替换为 null。但是我无法重现它。现在一切正常。

我不知道引擎盖下发生了什么,所以问题是,这种使用缓存的方式可靠吗?我能否像从数据存储中获取实体一样处理从缓存中获取的实体(访问子项、更新、删除...)?

最佳答案

需要注意两点:

  1. 存储到 Memcache 的所有对象都得到 serialized/deserialized ,这意味着它们的内存表示被采用并更改为一系列字节(反之亦然)。

  2. Collection.contains(object)使用 object.equals(anotherObject) 检查集合是否包含某个对象。默认情况下,Object.equals() 只有在 exact same object 时才为 true (= 同一内存位置的对象)。

考虑到:序列化对象然后反序列化它永远不会产生一个对象 deserialisedObject.equals(originalObject) == true

如果你真的需要这个,那么你应该覆盖存储在 Memcache 中的类中的 .equals()(以及 .hashCode()),这样你实际上比较类中有意义的值(=比较所有字段的值)。

关于java - GAE,JDO : working with entities loaded from cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com