Google Cloud Platform 有多个数据中心,它们并不总是保持相同记录的相同状态。如果您在增加该值后立即查询该值,则尤其如此。您可以使用祖先查询来检索实体,这将使其保持最新和一致。详情请看文章[1]。
这是祖先查询 [2] 的链接。这个想法是,当您使用祖先查询时,它会强制查询在所有更改完成后返回数据(对于该查询)。这确保了最新的强一致性。
[1] - https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/
[2] - https://cloud.google.com/appengine/docs/java/datastore/queries#Java_Ancestor_queries
===---=== 示例(来自我提供的第二个链接)
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity tom = new Entity("Person", "Tom");
Key tomKey = tom.getKey();
datastore.put(tom);
Entity weddingPhoto = new Entity("Photo", tomKey);
weddingPhoto.setProperty("imageURL",
"http://domain.com/some/path/to/wedding_photo.jpg");
Entity babyPhoto = new Entity("Photo", tomKey);
babyPhoto.setProperty("imageURL",
"http://domain.com/some/path/to/baby_photo.jpg");
Entity dancePhoto = new Entity("Photo", tomKey);
dancePhoto.setProperty("imageURL",
"http://domain.com/some/path/to/dance_photo.jpg");
Entity campingPhoto = new Entity("Photo");
campingPhoto.setProperty("imageURL",
"http://domain.com/some/path/to/camping_photo.jpg");
List<Entity> photoList = Arrays.asList(weddingPhoto, babyPhoto,
dancePhoto, campingPhoto);
datastore.put(photoList);
Query photoQuery = new Query("Photo")
.setAncestor(tomKey);
// This returns weddingPhoto, babyPhoto, and dancePhoto,
// but not campingPhoto, because tom is not an ancestor
List<Entity> results = datastore.prepare(photoQuery)
.asList(FetchOptions.Builder.withDefaults());
===---===
请参阅以下部分:
实体婚礼照片 = new Entity("照片", tomKey);
Entity dancePhoto = new Entity("Photo", tomKey);
这会生成一个带有祖先键“tomKey”的实体。
现在将实体保存到数据存储中:
List<Entity> photoList = Arrays.asList(weddingPhoto, babyPhoto,
dancePhoto, campingPhoto);
datastore.put(photoList);
当你需要获取结果时,执行一个特殊的查询:
Query photoQuery = new Query("Photo")
.setAncestor(tomKey);
这确保 photoQuery 不仅仅是针对任何随机数据中心提取任何数据的随机查询;它确保从数据存储中获取最新数据。