2011-08-16 13 views
1

データストアにいくつかのエンティティを追加する非常に単純なコードがあります。Googleのデータストアと一貫して保存されていないエンティティ

public final class storageUtil { 

    private static DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 

    public static Iterable<Entity> getAllEntities(String kind) { 
     Query q = new Query(kind); 
     PreparedQuery pq = datastore.prepare(q); 
     return pq.asIterable(); 
    } 

    public static void putEntity(Entity entity) { 
     datastore.put(entity); 
    } 


} 

私はputEntity(myEntity)、その後getAllEntities(myKind)、新しく入れたエンティティを呼び出す場合は、わずか3回のうち、戻されたリスト2に表示されます。

putの直後にdatastore.get(myKey)を呼び出すと、常にputされたエントリが返されます。

何が起こっているかについて私に手がかりを与えることはできますか?

+0

複数のスレッド、つまり競合状態が発生する可能性はありますか?私はGoogle DataStoreを知らないが、追加されたエンティティがまだフラッシュされておらず、したがってクエリによって返されないかもしれない。 – Thomas

答えて

0

どのような種類のデータストアを使用していますか? これは高いレプリケーション(デフォルト)データストアですか? 実際のサーバー(開発者ではない)に対してテストしていますか? この場合、この動作は「最終的に一貫した」動作のためにいくらか期待されます。

Using the High Replication Datastore

あなたはこの

+0

これは高いレプリケーションですが、実際のサーバーではなく、dev環境にあります。 –

+0

私はローカルリストを維持しているので、アプリケーションに保存するときに不一致が発生する可能性がありますが、アプリケーションを再起動すると一部のエンティティのみが読み込まれます。残りは消えました。 –

+0

エンティティグループを使用するようにアプリケーションを更新しました。これにより、矛盾(つまりリストに予想されるすべてのエンティティが含まれているためグループを取得している)が修正されたようですが、再起動しても保存されたエンティティの一部しかロードされません。これはローカルのdevデータストアの問題ですか、または実サーバにデプロイする際に問題が継続すると思いますか? –

0

を回避する方法を探し始めなければならないところであるあなたが例を見つけるでしょうhereトランザクションを使用して、データストアにあなたのエンティティを置きます。

関連する問題