Java Google应用程序引擎性能-检查对象是否存在

Java Google应用程序引擎性能-检查对象是否存在,java,performance,google-app-engine,google-cloud-datastore,Java,Performance,Google App Engine,Google Cloud Datastore,我正在使用Google App Engine编写一个系统,只有当对象还不存在时,我才需要将其放入数据存储中。我可以使用datastore.put()方法,但我需要知道该对象是否已经存在,以计算我拥有的新对象的数量 据我所知,我有以下选项(假设我将键作为属性和实体键): 我倾向于使用第二个,因为它看起来更直截了当,但我担心它可能不打算这样使用,因为它会引发异常,并且可能会产生开销 以下哪种方法更适合检查数据库中是否存在实体 有更好的方法吗?除非您的实体很大并且有很多属性,否则执行get会更快,在这

我正在使用Google App Engine编写一个系统,只有当对象还不存在时,我才需要将其放入数据存储中。我可以使用
datastore.put()
方法,但我需要知道该对象是否已经存在,以计算我拥有的新对象的数量

据我所知,我有以下选项(假设我将键作为属性和实体键):

我倾向于使用第二个,因为它看起来更直截了当,但我担心它可能不打算这样使用,因为它会引发异常,并且可能会产生开销

以下哪种方法更适合检查数据库中是否存在实体


有更好的方法吗?

除非您的实体很大并且有很多属性,否则执行get会更快,在这种情况下,仅键查询可能会更快。如果性能可能是这里的一个重要问题,我建议进行基准测试,但如果不是,后一种方法更简单。

如果一个
实体需要唯一性,那么如果有多个线程同时访问数据库,即使这种检查也不能保证唯一性

在这种情况下,两个线程都会看到不存在任何对象,并同时创建新对象。即使是事务也无法防止这种情况发生,因为应用程序不会阻止
读取
以确定唯一性和
写入
以保存实体之间的访问

我知道这听起来不太可能,但这确实发生在我们身上,比如当我们运行MapReduce作业以批量更新/创建超过8个碎片的大量记录(100k+)时

保证对象唯一性的唯一方法是指定其键的
name
属性。这将使数据存储
创建一个新实体(如果不存在),否则它将
将该实体更新为上次保存的对象

因此,不是:

Entity entity = new Entity("MyKind");
这确保每个所述财产只有一个唯一的实体:

String myPropertyValue = getPropValue();
Entity entity = new Entity("MyKind", myPropertyValue);
ds.put(entity); // Ensures only one Entity per this property value

谢谢您能否提供一些关于性能方面的一般最佳实践的参考?我找不到很多关于执行同一操作的不同方法的性能影响的信息(如列表vs asIterable、get vs query、批处理vs多个put等)。@Yanir简言之,rpc越少越好。尝试使用Appstats并对任何您怀疑的东西进行基准测试。
Entity entity = new Entity("MyKind");
String myPropertyValue = getPropValue();
Entity entity = new Entity("MyKind", myPropertyValue);
ds.put(entity); // Ensures only one Entity per this property value