由于使用没有祖先查询的高复制数据存储,听起来您遇到了最终一致性问题。从为强一致性构建数据(强调添加):
Google App Engine 的 High Replication Datastore (HRD) 通过在多个数据中心同步存储数据,为您的读写提供高可用性。但是,从提交写入到它在所有数据中心中可见的延迟意味着跨多个实体组的查询(非祖先查询)只能保证最终一致的结果。因此,此类查询的结果有时可能无法反映基础数据的最新更改。
要获得高度一致的查询结果,您需要使用祖先查询将结果限制为单个实体组。这是有效的,因为实体组是一致性和事务性的单位。所有数据操作都应用于整个组;在整个实体组更新之前,祖先查询不会返回其结果。如果您的应用程序依赖于某些查询的高度一致的结果,您可能需要在设计数据模型时考虑到这一点。本页讨论了构建数据以支持强一致性的最佳实践。
这是使用该文档中的祖先查询进行编写的示例:
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
String guestbookName = req.getParameter("guestbookName");
Key guestbookKey = KeyFactory.createKey("Guestbook", guestbookName);
String content = req.getParameter("content");
Date date = new Date();
// Place greeting in same entity group as guestbook
Entity greeting = new Entity("Greeting", guestbookKey);
greeting.setProperty("user", user);
greeting.setProperty("date", date);
greeting.setProperty("content", content);
并阅读:
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Key guestbookKey = KeyFactory.createKey("Guestbook", guestbookName);
Query query = new Query("Greeting", guestbookKey)
.setAncestor(guestbookKey)
.addSort("date", Query.SortDirection.DESCENDING);
List<Entity> greetings = datastore.prepare(query)
.asList(FetchOptions.Builder.withLimit(10));
文档中更详细地讨论了使用祖先查询的注意事项。