【问题标题】:Datastore throwing exceptions when getting entities by Key通过 Key 获取实体时数据存储区抛出异常
【发布时间】:2012-05-16 04:40:13
【问题描述】:

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

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

添加日志记录后,我可以确认 Key 不为空,并且当我使用密钥通过数据存储查看器获取实体时,它工作正常。

更新 3

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

【问题讨论】:

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


    【解决方案1】:

    Google 似乎破坏了 Entity 类的序列化/反序列化。他们随后回滚了导致问题的更新并解决了问题。感谢 Alfred、Chris 和其他在听到这个问题后几个小时内解决了这个问题的人。

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

    【讨论】:

    • 即使是这样,您只需清除一次内存缓存即可立即解决此问题。
    • 我现在收到一个 nullPointer 异常,现在是 2013 年 4 月。该错误是否返回? stackoverflow.com/questions/15850386/…。并且@GuidovanRossum 清除内存缓存并没有帮助。
    【解决方案2】:

    刚刚出现同样的错误。

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

    我在 google 的 objectify 组上发布了一个问题。它目前处于适度状态。我希望能理解这个奇怪的错误......

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

    【讨论】:

    • 刷新缓存似乎可行,但问题又回来了,似乎一些错误的键或值最终进入缓存。在我们找出问题所在之前,我已经删除了所有缓存。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2022-01-23
      • 2011-10-03
      • 1970-01-01
      相关资源
      最近更新 更多