0

有时(当我执行压力测试时)存储在 memcache 中的对象已损坏(它缺少属性,当我尝试访问它时给我“NullPointerException”)。是否与不同 memcache 写入之间的错误同步有关?事实上,在我的代码的不同部分,我只是以这种方式更新存储在 Memcache 中的 UserAccount:

cache.put(tempUser.getKey(), tempUser);

..我尝试以这种方式检索:

if (cache.contains(key)) {
    readObject = (T) cache.get(key);
    return readObject;
}

与此检索相关,当我尝试(例如)检索时,我得到 NullPointerException:

readObject.getMyProperty()

我试图了解此功能(https://developers.google.com/appengine/docs/java/memcache/overview#Safely_Handling_Concurrent_Memcache_Updates),但它似乎没有很好的记录。我还在stackoverflow上查看了这些答案:

..但它似乎并不符合我的需求。最后,我只需要确保一个值很好地存储在缓存中,没有竞争条件可能影响其完整性的风险。

==================================================== ============================== 更新:我尝试更好地指定行为:我在这一行中得到“NullPointerException”:

if(readObject!=null && readObject.getMyProperty.equals("test"))

所以它不是(仅)完全为空,而只是一个属性。看来真的是坏掉了。除此之外,我知道我必须改进检索阶段!

==================================================== ===============================

新更新:我在 memcache 中找到了所有属性都等于 null 的对象,除了键之一

4

2 回答 2

4

在调用 cache.contains() 和 cache.get() 之间,您的条目可能会从 memcache 中逐出。一个解决方案是调用 cache.get() 并检查 null 结果,在这种情况下条目不再存在。您甚至可以为不需要的呼叫节省几毫秒。永远不要依赖调用之间的不变状态。相反,memcache 为您提供有用的原子复合操作,以避免出现诸如 increment()、putIfUntouched() 和 put()+ADD_ONLY_IF_NOT_PRESENT 之类的竞争条件。

于 2012-07-11T06:04:21.137 回答
1

Memcache 使用标准的 Java 序列化来序列化/反序列化对象。

要完成这项工作,您的类(以及其中的所有字段)必须实现java.io.Serializable.

你的领域是什么类型MyProperty

于 2012-07-11T08:17:57.213 回答