【问题标题】:GAE datastore: Entity deleted only after multiple calls to delete()GAE 数据存储:仅在多次调用 delete() 后才删除实体
【发布时间】:2013-04-19 22:59:22
【问题描述】:

我正在使用 Eclipse 在本地计算机上使用 GAE 数据存储。我创建了两个 servlet - AddMovieDeleteMovie:

添加电影

Entity movie = new Entity("movie",System.currentTimeMillis());
movie.setProperty("name",     "Hakeshset Beanan");
movie.setProperty("director", "Godard");
datastore.put(movie);

删除电影

Query q = new Query("movie");
PreparedQuery pq = datastore.prepare(q);
List<Entity> movies = Lists.newArrayList(pq.asIterable());
response.put("numMoviesFound", String.valueOf(movies.size()));

for (Entity movie : movies) {
    Key key = movie.getKey();
    datastore.delete(key);
}

有趣的是,DeleteMovie servlet 并没有删除所有的电影。连续调用返回{"numMoviesFound":"15"},然后是{"numMoviesFound":"9"}{"numMoviesFound":"3"},最后是{"numMoviesFound":"3"}

为什么不是一次从数据存储中删除所有电影?

更新:问题似乎只发生在本地 Eclipse 上,而不是 GAE 服务器上。

【问题讨论】:

    标签: java google-app-engine nosql google-cloud-datastore


    【解决方案1】:

    我认为您应该在一个事务中删除所有电影,这样可以确保更好的一致性。

    说到一致性,你的问题就在这里:

    Google App Engine 的 High Replication Datastore (HRD) 通过在多个数据中心同步存储数据,为您的读写提供高可用性。但是,从提交写入到它在所有数据中心中可见的延迟意味着跨多个实体组的查询(非祖先查询)只能保证最终一致的结果。因此,此类查询的结果有时可能无法反映基础数据的最新变化。

    https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多