0

ストレス テストを実行すると、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 ではなく、単なるプロパティになります。本当に腐っているようです。それとは別に、リトリーブ フェーズを改善する必要があることはわかっています。

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

新しい更新: memcache で、キー 1 を除いて、すべてのプロパティが null に等しいオブジェクトを見つけました

4

2 に答える 2

4

cache.contains() と cache.get() の呼び出しの間に、エントリが memcache から削除される場合があります。解決策は、単に cache.get() を呼び出して null の結果を確認することです。この場合、エントリはもう存在しません。不要な呼び出しのために数ミリ秒も節約できます。呼び出し間で変更されていない状態に依存しないでください。代わりに、memcache は、increment()、putIfUntouched()、put()+ADD_ONLY_IF_NOT_PRESENT などの競合状態を回避するための便利なアトミック複合操作を提供します。

于 2012-07-11T06:04:21.137 に答える
1

Memcache は、標準の Java シリアライゼーションを使用してオブジェクトをシリアライズ/デシリアライズします。

これを機能させるには、クラス (およびそれらのすべてのフィールド) で を実装する必要がありますjava.io.Serializable

MyPropertyあなたのフィールドはどのタイプですか?

于 2012-07-11T08:17:57.213 に答える