为什么现在()? (物化)

为什么我想要异步加载Objectify实体? 异步加载实际上意味着什么?

根据Objectify关于加载的文档 ,以下加载实体的方式是异步的:

// Simple key fetch, always asynchronous Result th = ofy().load().key(thingKey); 

如果我想要一个加载同步执行,那么我应该这样做:

 Thing th = ofy().load().key(thingKey).now(); // added .now() 

对我而言,异步意味着该操作将在稍后的某个未指定时间发生。 对于保存,异步是有意义的,因为数据存储区操作可能需要一些时间来自行完成而不会阻塞应用程序代码。

但是加载时,异步意味着负载会在另一个时间发生吗? 如何在Java中实现这一点? 我认为当代码行Result th = ofy().load().key(thingKey);时,必须更新变量Result th Result th = ofy().load().key(thingKey); 完成执行。

作为一个新手,我需要花费很长时间来解决这个问题(例如,参见Objectify错误“你无法在JUnit中为具有null @Id的对象创建一个键” )。

所以我有几个问题:

1]为什么我想要异步加载Objectify实体?

2]异步加载实际意味着什么?

3] now()用于加载和now()用于保存之间的概念链接是什么?

同步负载( 源 )

 Thing th = ofy().load().key(thingKey).now(); 

同步保存( 源 )

 ofy().save().entity(thing1).now(); 

4]为什么不同步保存和加载的默认行为?

异步操作启动网络提取到后端,然后让代码继续执行。 异步操作的优点是您可以并行运行其中几个:

 Result th1 = ofy().load().key(thingKey1); Result th2 = ofy().load().key(thingKey2); Result th3 = ofy().load().key(thingKey3); th1.now(); th2.now(); th3.now(); 

这比每次立即调用now()要快得多。 请注意,这是一个不好的示例,因为您可能会使用批量get(也可以并行操作),但您可以同时运行多个查询,保存,删除等操作。

now()总是强制同步完成,阻塞直到完成。

Google云支持部门对支持案例05483551的回复:

Java中的“异步”意味着使用“期货”或类似Future的结构。 java [1]中的Future是一个对象,它表示在下一行开始在当前线程中执行时不一定需要执行和完成的操作。

在Java中调用异步函数将立即返回一个Future,表示后台“线程”将在计算/网络调用上工作,同时代码的下一行继续执行,而不需要该结果。 当在Future对象上调用方法.get()时,返回结果,及时获得结果,或者线程将等到获得结果,在.get()调用之后将执行传递给下一行只有这一次发生。

在Objectify中,避免了期货,而是定义了结果界面[2],原因与抛出的exception有关,这使得在期货的基础上开发变得痛苦。 然而,它们以几乎相同的方式工作。 如果常规Future有方法.get(),那么Result接口(由几个不同的具体类实现,取决于你正在做什么样的Objectify调用)有.now(),它检索结果或等待线程直到它可用。

您可能希望异步加载实体的原因是,您有一个请求处理程序或API方法,该方法稍后需要函数中的实体,但还有一些其他计算要执行,与实体无关。 您可以在第一行中启动实体的加载,获取结果,然后只有在其他不相关的代码完成执行后才在结果上调用.now()。 如果您在调用.now()实际启动加载时等待了这一点,您可能会让响应处理程序/ API方法只是等待结果,而不是进行有用的计算。

最后,用于加载的.now()和用于保存的.now()之间的概念性链接是两个操作都在后台发生,并且最终被强制,等待执行线程,当在结果上调用.now()时interface-implementation对象,由save()或load()调用返回。

我希望这有助于解释Java Objectify中的异步构造。 如果您有任何其他问题或疑问,请随时在回复中包含这些问题,我们将很乐意为您提供帮助。

此致

尼克技术解决方案代表云平台支持

[1] http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

[2] http://objectify-appengine.googlecode.com/svn/trunk/javadoc/com/googlecode/objectify/Result.html

Google Cloud Datasore旨在为用户提供积极的关系和非关系体验,基本上是两全其美的体验。 Google数据存储区是一个NoSQL数据库,它提供了最终的一致性以提高可扩展性,但也为您提供了选择强一致性的选项。

谷歌的这篇文章, 与Google Cloud Datastore平衡强大和最终的一致性 ,将在很长一段时间内回答您的一些问题。 它解释了最终的一致性模型,这对于理解数据存储区与您的问题相关的工作原理至关重要。