2

我在 GAE 中创建了一个简单的应用程序。这是我的简单实体/JDO 类

@PersistenceCapable(detachable = "true")
public class Domain implements Serializable{
    @Persistent
    private String url;
    @Persistent
        private String aliasName;
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
}

我正在对这个类执行 CRUD 操作。我正在做的只是添加不同的对象,然后查看该对象提供删除和编辑已创建实体的选项。当我单击视图页面中任何实体的删除链接时。我只是删除它。我的问题是,在删除该实体后,我再次将用户重定向到查看页面,以便用户可以看到实体已被删除。但是当我再次看到查看页面时,查看页面也显示已删除的实体。表示实体未被删除。如果我刷新页面 3,4 次,然后该实体没有显示。这是因为实体最初已被删除,但完成此过程需要一些时间。我想知道为什么我要面对 GAE 的这种行为??如果 GAE 或 JDO 执行 CRUD 操作很慢。我正在共享用于删除实体和查看所有实体的代码。我的代码中是否有任何问题,请告诉我。

    @SuppressWarnings({ "rawtypes", "unchecked" })
public List retrieveDomains() {
    PersistenceManager pm = PMFSingleton.get().getPersistenceManager();
    Query query = pm.newQuery(Domain.class);
    List<Domain> list = null;
    List<Domain> detachedList = null;
    try {
        list = (List<Domain>) query.execute();
        detachedList = new ArrayList<Domain>();
        for (Domain obj : list) {
            detachedList.add(pm.detachCopy(obj));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        query.closeAll();
        pm.close();
    }
    return detachedList;
}

  public void deleteDomain(String name) {
    PersistenceManager pm = PMFSingleton.get().getPersistenceManager();
    Domain domain = null;
    Transaction txn = null;
    try {
        txn = pm.currentTransaction();
        txn.begin();
        domain = (Domain) pm.getObjectById(Domain.class,name);
        pm.deletePersistent(domain);
        txn.commit();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if ( txn.isActive()) {
            txn.rollback();
        }
        pm.close();
    }       
}
4

1 回答 1

3

您遇到的称为最终一致性:对实体进行更改(=删除)后,索引会异步更新。这意味着删除操作返回,但索引尚未更新。由于查询依赖于索引,它将显示已删除的数据,直到索引最终更新。

如果您想了解数据存储的工作原理,可以阅读一系列文章。

于 2013-11-15T07:39:05.413 回答