我在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();
}
}
答案 0 :(得分:3)
您遇到的内容称为eventual consistency:对实体(= delete)进行更改后,索引将异步更新。这意味着删除操作返回,但索引尚未更新。由于查询依赖于索引,因此它将显示已删除的数据,直到索引最终更新为止。
如果您想了解数据存储的工作原理,可以使用series of articles。