2012-01-05 111 views
2

我是App Engine的新手,写了一个示例应用程序。如果我创建或更新实体:如何避免GoogleAppEngine DataStore延迟?

Entity record = new Entity(...); 
... set properties 
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
datastore.put(record); 

,然后重定向到执行下面的代码,其中新的或更新的实体显示

resp.sendRedirect("MainPage.jsp"); 

DatastoreService datastore = 
DatastoreServiceFactory.getDatastoreService(); 
Query query = new Query(...).addSort(..., Query.SortDirection.DESCENDING); 
List<Entity> entities = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(20)); 

的新记录不在列表中。页面被更新(如显示的时间戳所示),但是当我刷新页面时,仅在延迟几秒钟之后才显示新记录或现有记录的修改。

这怎么可以避免? DataStore可能不适合这样的事情吗?

我使用Eclipse的本地测试环境从GAE与Windows XP 64

+0

https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency – 2014-07-08 00:06:28

回答

8

是的,这叫做"eventual consistency",它是HRD的默认更新模型(现在是所有新实例的默认更新模型)。

因此,放置一个实体然后查询它可能不会返回(事件一致性),但放置它然后获取它(通过一个键)(get通过一个键)将立即返回(强一致性)。

解决方法是,:

  1. 采用主从数据存储,或
  2. 如果可能的话,重写代码来使用,而不是get查询。

此外,本地开发服务器仅用于测试,并不像生产实例那样运行,所以您应该始终(最终)对生产进行测试。

+0

我不会推荐使用Master Slave数据存储。为了克服“最终一致性”,有一些提示,关于通过密钥获取实体是其中之一,另一种是使用实体组对数据建模。由于父母的查询应返回强一致性结果。 – 2012-01-06 16:34:34

-1

既然你在GAE上运行,你最好的选择是使用其Memcache短期检索(你仍然需要把东西在DataStore中进行持久化)。

+0

请记住,memcache并不保证能够返回任何内容,因此您与“最终一致性”的内容大致相同HR数据存储。 – 2012-01-05 21:17:51

相关问题