按键获取实体时,数据存储区抛出异常

时间:2012-05-16 04:40:13

标签: java google-app-engine google-cloud-datastore objectify

在过去的几个小时里,当按键获取实体时,我开始遇到异常:

Caused by: java.lang.NullPointerException
    at com.google.appengine.api.datastore.PropertyContainer.getProperties(PropertyContainer.java:48)
    at com.googlecode.objectify.impl.Transmog.load(Transmog.java:336)
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.toObject(ConcreteEntityMetadata.java:203)
    at com.googlecode.objectify.impl.AsyncObjectifyImpl$1.wrap(AsyncObjectifyImpl.java:82)
    at com.googlecode.objectify.impl.AsyncObjectifyImpl$1.wrap(AsyncObjectifyImpl.java:69)
    at com.google.appengine.api.utils.FutureWrapper.wrapAndCache(FutureWrapper.java:57)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:98)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90)
    at com.googlecode.objectify.impl.ResultAdapter.get(ResultAdapter.java:29)
    at com.googlecode.objectify.impl.ObjectifyImpl.get(ObjectifyImpl.java:63)

它们是断断续续的,并且大约有50%的时间被抛出。

更新

第二行代码抛出异常:

Objectify ofy = ObjectifyService.begin();
retVal = ofy.get(entityKey);

添加日志以查看entityKey的值....

更新2

添加日志记录后,我可以确认密钥是非空的,而且当我使用密钥获取使用数据存储区查看器的实体时,它可以正常工作。

更新3

我可以确认这是与Memcache有关的问题。禁用objectify缓存后,我不再收到此错误。所以要么这是一个客观化的错误(不太可能,因为我没有更改/升级我们的客观化库)或者appengine memcache服务已经以某种方式发生了变化。

3 个答案:

答案 0 :(得分:2)

Google似乎打破了Entity类的序列化/反序列化。他们随后回滚了导致问题的更新并解决了问题。感谢阿尔弗雷德,克里斯和其他人在听到这个问题的几个小时内解决了这个问题。

不幸的是,这不是任何正常错误捕获机制(即序列化异常)可以处理的问题。 memcache调用成功并返回一个Entity对象,但后续对Entity对象的getProperties()调用失败。讨厌的虫子。

答案 1 :(得分:0)

刚出现同样的错误。

刷新缓存纠正了它,不要问为什么,我不知道但它有效。

我在google的客观化群体上发布了一个问题。它目前正在适度。我希望这个奇怪的错误能被理解......

要刷新缓存,请转到您的appengine控制台> Memcache Viewer>刷新缓存

答案 2 :(得分:-1)

您是否在appengine-web-app.xml中声明了GAE线程安全? Objectify文件说明:

会话缓存不是线程安全的。你永远不应该在线程之间共享一个Objectify实例。

http://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify