0

HRなしで問題なく動作するこのコードがあります:

protected Entity createEntity(Key key, Map<String, Object> props){
    Entity result = null;
    try {
        Entity e = new Entity(key);
        Iterator it = props.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
            String propName = entry.getKey();
            Object propValue = entry.getValue(); 
            setProperty(e, propName, propValue);
        }
        key = _ds.put(e);
        if (key != null)
            result = _ds.get(key);
    } catch (EntityNotFoundException e1) {
    }
    return result;
}

これは単純なメソッドであり、その機能は新しいEntityout aa givenを作成することでありkey、それ以外の場合は単に NULL を返します。これは、JUnit で HR 構成がなくても正常に機能しますが、構成すると、_ds.get(key)キーのスローが見つからないというエラーが常に発生します。

EntityNotFoundException: No entity was found matching the key:

具体的には、次の場合です。

while(it.hasNext()){
   // stuff
   createEntity(key, map); 
   // stuff
}

私のコードの問題は、エンティティを取得しようとするのが早すぎることだと思います。もしそうなら、どうすればこれに頼らずに対処できますかMemcache

アップデート:

createEntityトランザクション内で実行されると、失敗します。ただし、惨めに失敗した場合、トランザクションの外でそれを削除すると。トランザクション内で実行できるようにする必要があります。これは、より高いレベルの API がグループとして存在する必要がある多くのオブジェクトを配置するためです。

アップデート:

_ds.get(key)私はストロムのアドバイスに従いましたが、メソッドを実行PreparedQuery countEntitiesしないと失敗するという奇妙な副作用が見つかりました。どこに追加して_ds.get(key)も、何もしないか、そのEntity戻り値を保存してcountEntities、期待されるカウントを返します。何故ですか?

4

2 に答える 2

0

GAE 環境にようこそ。あきらめる前に、何度も読んでみてください。

 int counter = 0;
 while (counter < NUMBER_OF_TRIES){
  try {

   //calling storage or any other non-reliable thing
   if(success) {break;} //escape away if success

   } catch(EntityNotFoundException e){
     //log exception
     counter++;
   }
 }

Google ドキュメントからの重要な注意: 「同じエンティティ グループに書き込むことができるレートは、エンティティ グループへの 1 秒間の書き込みに制限されています。」

ソース: https://developers.google.com/appengine/docs/java/gettingstarted/usingdatastore

于 2013-04-10T10:10:20.713 に答える