26

检查 google-app-engine 数据存储中是否存在实体的最佳/最快方法是什么?现在我正在尝试通过键获取实体并检查 get() 是否返回错误。

我不知道在数据存储中获取实体的过程。有没有更快的方法只做这个检查?

4

3 回答 3

6

您提出的确实是了解您的实体是否存在的最快方法。唯一让你慢下来的是获取和反序列化你的实体所花费的时间。如果您的实体很大,这可能会减慢您的速度。

如果此操作(检查是否存在)是您的主要瓶颈并且您拥有大型实体,您可能希望通过使用两个实体来滚动您自己的检查系统 - 首先您将拥有包含数据的现有实体,以及第二个实体要么存储对真实实体的引用,要么存储一个空实体,其中键只是您可以计算的原始实体键的变体。您可以使用第二个实体快速检查是否存在,然后仅在需要数据时才获取第一个实体。

我认为更好的方法是设计你的密钥,这样你就知道不会有重复,或者你的操作是幂等的,这样即使旧实体被覆盖,也没关系。

于 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>仅包含 one的 a 进行获取Key该方法返回 aMap<Key, Entity>您可以检查它是否包含实际值或null,例如:

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

一般来说,虽然我认为将它包装get()在一个 try/catch 中会更容易,null如果它EntityNotFoundException被捕获则返回。

于 2012-04-16T14:53:12.187 回答