GAE Memcache中的损坏值

时间:2012-07-11 00:45:27

标签: java google-app-engine memcached

有时(当我执行压力测试时)存储在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"))

因此它不是(仅)完全为null,而只是一个属性。它似乎真的被腐蚀了。除此之外,我知道我必须改善检索阶段!

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

NEW UPDATE:我发现memcache中的对象除了键值之外所有属性都等于null

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

您的MyProperty字段的类型是什么?