有时(当我执行压力测试时)存储在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
答案 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
字段的类型是什么?