web-dev-qa-db-ja.com

エンティティがGoogleAppEngineデータストアに存在するかどうかを確認しています。

エンティティがgoogle-app-engineデータストアに存在するかどうかを確認するための最良/最速の方法は何ですか?今のところ、キーでエンティティを取得し、get()がエラーを返すかどうかを確認しようとしています。

データストアでエンティティを取得するプロセスがわかりません。このチェックのみを行うためのより速い方法はありますか?

26
Victor

com.google.appengine.apiは廃止され、App EngineGCSクライアントが採用されました。

クエリの使用を検討しましたか?推測とチェックは、データストアに存在するエンティティを見つけるためのスケーラブルな方法ではありません。クエリを作成して、指定された一連の条件を満たすデータストアからエンティティを取得できます。

https://developers.google.com/appengine/docs/Java/datastore/queries

編集:

キーのみのクエリはどうですか?キーのみのクエリは、完全なエンティティを返すクエリよりも高速に実行されます。キーのみを返すには、Query.setKeysOnly()メソッドを使用します。

new Query("Kind").addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, key).setKeysOnly();

ソース:[1]: http://groups.google.com/group/google-appengine-Java/browse_thread/thread/b1d1bb69f0635d46/0e2ba938fad3a543?pli=1

5
Eric Leschinski

あなたが提案したことは、あなたの実体が存在するかどうかを知るための最速の方法です。速度が低下するのは、エンティティのフェッチと逆シリアル化にかかる時間だけです。エンティティが大きい場合、速度が低下する可能性があります。

このアクション(存在の確認)が大きなボトルネックであり、大きなエンティティがある場合は、2つのエンティティを使用して独自のチェックシステムを作成することをお勧めします。最初にデータを含む既存のエンティティを作成し、次に実際のエンティティへの参照を格納するか、キーが計算可能な元のエンティティキーの単なるバリエーションである空のエンティティを格納します。 2番目のエンティティを使用して存在をすばやく確認し、データが必要な場合にのみ最初のエンティティをフェッチできます。

私が思うより良い方法は、重複がないことを知っているように、または操作がべき等であるようにキーを設計することです。そうすれば、古いエンティティが上書きされても問題ありません。

6
dragonx

Keyを1つだけ含む_List<Key>_を使用してフェッチできます。 そのメソッド は_Map<Key, Entity>_を返し、実際の値またはnull、例:

_Entity e = datastoreService.get(Arrays.asList(key)).get(key);
_

一般的には、nullがキャッチされた場合にEntityNotFoundExceptionを返すtry/catchでget()をラップする方が簡単だと思います。

3
Jason Hall