GAE,JDO:使用从缓存加载的实体

时间:2012-08-17 13:47:57

标签: java google-app-engine jdo jcache

我使用简单的层来按键或id加载和存储实体,我只是在此层添加了缓存。当具有给定密钥的实体位于缓存中时,返回它而不是从数据存储区中获取。当实体更新并保存到数据存储区时,该层只是将缓存中的实体设置为null。它是完全透明的。

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

我不知道幕后发生了什么,所以问题是,这种使用缓存可靠的方式吗?我可以使用从缓存中获取的实体,就像从数据存储区中获取它们一样(访问子项,更新,删除......)?

1 个答案:

答案 0 :(得分:3)

有两点需要注意:

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

  2. Collection.contains(object)使用object.equals(anotherObject)检查集合是否包含特定对象。默认情况下,Object.equals()只有true,如果这是exact same object(=同一内存位置的对象)。

  3. 鉴于:序列化对象然后反序列化它永远不会产生一个给出deserialisedObject.equals(originalObject) == true的对象。

    如果你确实需要这个,那么你应该在存储在Memcache中的类中覆盖.equals()(以及.hashCode()),这样你才能真正比较Class中有意义的值(=比较值所有领域)。