1

嗨,我有谷歌应用引擎应用程序。我使用 JPA 和简单的 servlet 和 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");

和 servlet 用于查看培训列表

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

您遇到的是一个称为最终一致性的 Datastore 属性。

基本上发生的情况是:当您将数据写入 HRD 时,它会将数据写入表,然后在构建索引之前返回(= 索引是异步构建的)。由于查询需要索引,因此在建立索引之前,它们不会找到新写入的数据。

解决方案(在上面的链接中了解更多信息):

  1. 使用 get 而不是查询。获取总是强一致的。重构您的应用程序,以便将新保存的数据的键传递给视图 JSP,像往常一样执行查询,然后通过 get 将新写入的数据添加到列表中。
  2. 使用链接中描述的祖先查询(恕我直言,在您的情况下是一个糟糕的解决方案)。
于 2012-11-06T08:33:00.503 回答