26

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

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

4

3 に答える 3

6

あなたが提案したことは、あなたのエンティティが存在するかどうかを知るための最速の方法です。速度を低下させる唯一の要因は、エンティティのフェッチとデシリアライズにかかる時間です。エンティティが大きい場合、これにより速度が低下する可能性があります。

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

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

于 2012-04-16T18:51:37.107 に答える
5

com.google.appengine.apiは、App Engine GCS クライアントを支持して廃止されました。

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

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

于 2012-04-16T14:36:33.240 に答える
3

List<Key>1 つだけを含む を使用してフェッチできますKeyそのメソッドMap<Key, Entity>は、実際の値または が含まれているかどうかを確認できる を返しますnull。次に例を示します。

Entity e = datastoreService.get(Arrays.asList(key)).get(key);

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

于 2012-04-16T14:53:12.187 に答える