1

ここ数時間で、エンティティをキーで取得するときに例外が発生し始めました。

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% の確率で投げられます。

アップデート

コードの 2 行目で例外がスローされます。

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

ロギングを追加して、entityKey の値を確認します....

更新 2

ロギングを追加した後、キーが null でないこと、およびキーを使用してデータストア ビューアーを使用してエンティティを取得すると、問題なく動作することを確認できます。

更新 3

これは Memcache に関する問題であることを確認できます。objectify キャッシュを無効にした後、このエラーは表示されなくなりました。つまり、これは objectify のバグであるか (objectify ライブラリを変更またはアップグレードしていないため可能性は低い)、または appengine memcache サービスが何らかの形で変更されています。

4

3 に答える 3

2

Google が Entity クラスのシリアル化/逆シリアル化を破ったようです。その後、問題の原因となったアップデートをロールバックし、問題は解決しました。Alfred、Chris、および問題について聞いてから数時間以内に問題を解決した他の人々に称賛を。

残念ながら、これは通常のエラー トラップ メカニズム (つまり、シリアライゼーション例外) で処理できる問題ではありませんでした。memcache の呼び出しは成功し、Entity オブジェクトが返されましたが、その後の Entity オブジェクトに対する getProperties() の呼び出しは失敗しました。厄介なバグ。

于 2012-05-16T17:31:31.740 に答える
0

同じエラーが発生しました。

キャッシュをフラッシュすると修正されました。理由はわかりませんが、うまくいきました。

objectify の Google グループに質問を投稿しました。現在、モデレーション中です。この奇妙なバグが理解されることを願っています...

キャッシュをフラッシュするには、appengine コンソール > Memcache Viewer > Flush Cache に移動します。

于 2012-05-16T10:05:48.730 に答える
-1

appengine-web-app.xml で GAE スレッド セーフを宣言しましたか? Objectify のドキュメントには次のように記載されています。

セッション キャッシュはスレッドセーフではありません。スレッド間で Objectify インスタンスを共有しないでください。

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

于 2012-05-17T10:56:53.390 に答える