嗨,我有Google App Engine应用程序。我使用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);


问题是,我存储到数据库记录,但是在index.jsp上却不显示。我有时尝试刷新页面后,然后在那儿记录。因此,在存储记录和在jsp上显示之间会延迟几秒钟。

问题在哪里?

最佳答案

您遇到的是一个名为eventual consistency的数据存储属性。

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

解决方案(有关更多信息,请参见上面的链接):


使用get代替查询。获取始终是高度一致的。重组应用程序,以便将新保存的数据的密钥传递给视图JSP,照常进行查询,然后通过get将新写入的数据添加到列表中。
如链接中所述使用Ancestor查询(恕我直言,这是您的解决方案)。

10-07 12:23
查看更多