Java 如何避免GoogleAppEngine数据存储延迟?

Java 如何避免GoogleAppEngine数据存储延迟?,java,google-app-engine,jsp,servlets,Java,Google App Engine,Jsp,Servlets,我是应用程序引擎新手,并编写了一个示例应用程序。如果我创建或更新实体: Entity record = new Entity(...); ... set properties DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); datastore.put(record); 然后重定向到显示新实体或更新实体的页面 resp.sendRedirect("MainPage.jsp"); 其中执行以下

我是应用程序引擎新手,并编写了一个示例应用程序。如果我创建或更新实体:

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));
DatastoreService数据存储=
DatastoreServiceFactory.getDatastoreService();
Query Query=new Query(…).addSort(…,Query.SortDirection.DESCENDING);
列表实体=datastore.prepare(query).asList(FetchOptions.Builder.withLimit(20));
新记录不在列表中。页面将被更新(如显示的时间戳所示),但新记录或现有记录的修改仅在我刷新页面时延迟数秒后才会显示

如何避免这种情况? 数据存储可能不适合这样的事情吗


我使用的是GAE的Eclipse本地测试环境和WindowsXP64

由于您在GAE上运行,您最好的选择是使用its进行短期检索(您仍然需要将内容放入数据存储中以便持久化)。

是的,这被调用,并且是HRD的默认更新模型(现在所有新实例都是默认的)

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

解决办法是:

  • 使用主从数据存储,或
  • 如果可能,重写代码以使用
    get
    而不是查询

  • 另外,本地dev服务器仅用于测试,其行为与生产实例不完全相同,所以您应该始终(最终)在生产环境中进行测试

    请记住,memcache不保证返回任何内容,因此您的处境与HR数据存储的“最终一致性”大致相同。我不建议使用主从数据存储。要克服“最终一致性”,有几个技巧,其中一个是按键获取实体,另一个是使用实体组对数据建模。对于父级的As查询应返回强一致性结果。