1

こんにちは、Google アプリ エンジン アプリケーションを使用しています。JPAとシンプルなサーブレットとjspを使用しています。

私のコード:

Training training = new Training();
    training.setCoachName(req.getParameter("coachName"));
    training.setDate(req.getParameter("date"));
    training.setTime(req.getParameter("time"));
    EntityManager entityManager = EMFService.get().createEntityManager();
    try {
        entityManager.getTransaction().begin();
        entityManager.persist(training);
        entityManager.flush();           
        entityManager.getTransaction().commit();
    } finally {
        entityManager.close();
    }

    resp.sendRedirect("/overview");

およびトレーニングのリストを表示するためのサーブレット

EntityManager entityManager = EMFService.get().createEntityManager();
    Query q = entityManager.createQuery("select t from " + Training.class.getName() + " t ");
    List<Training> result = q.getResultList();
    req.setAttribute("trainigs", result);
    entityManager.close();
    RequestDispatcher view = req.getRequestDispatcher("index.jsp");
    view.forward(req, resp);

問題は、db レコードに保存することですが、index.jsp に表示されません。時々ページを更新しようとすると、レコードがあります。そのため、レコードの保存と jsp への表示の間に数秒の遅延があります。

問題はどこですか?

4

1 に答える 1

1

あなたが遭遇したのは、結果整合性と呼ばれるデータストア プロパティです。

基本的に何が起こるかというと、HRD にデータを書き込むと、テーブルにデータが書き込まれ、インデックスが作成される前に返されます (= インデックスは非同期で作成されます)。クエリにはインデックスが必要なため、インデックスが作成されるまで、新しく書き込まれたデータは見つかりません。

解決策 (上記のリンクで詳細をお読みください):

  1. クエリの代わりに get を使用します。Get は常に強い一貫性があります。アプリを再構築して、新しく保存されたデータのキーをビュー JSP に渡し、通常どおりクエリを実行してから、新しく書き込まれたデータを get 経由でリストに追加します。
  2. リンクで説明されているように、祖先クエリを使用します(私見、あなたの場合は悪い解決策です)。
于 2012-11-06T08:33:00.503 に答える