谷歌云平台有多个数据中心,并且它们并不总是保持相同记录的相同状态。如果您在增加值后立即查询该值,则尤其如此。您可以使用祖先查询来检索实体,这将使其更新和一致。详情请看文章[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
=== --- ===示例(从I提供的第二链路)
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());
=== --- === 看到这些部分:
Entity weddingPhoto = new Entity(“Photo”,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不只是一个随机的查询针对任何随机数据中心提取任何数据;它确保它从数据存储中获取最新的数据。
我是使用java的GAE的新人。我不能理解祖先查询。请用例子来解释。我正在使用DAO和javax.persistence.Query。使用此示例 – 2014-12-10 06:50:12
请使用祖先查询的数据存储查询方法(如示例所示)。 这个想法是,当你提供一个祖先密钥给一个实体,然后再使用祖先密钥进行查询时。它将返回实体的最新版本。 – 2014-12-10 17:24:16
好的谢谢你给的例子。我不问主键。我将创建自定义迭代器。它是否有助于自定义迭代器? – 2014-12-11 05:35:54