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 に答える