GAE + JDO + JAVA + CRUD

时间:2013-11-15 05:41:39

标签: java google-app-engine jdo

我在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();
    }       
}

1 个答案:

答案 0 :(得分:3)

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

如果您想了解数据存储的工作原理,可以使用series of articles