嗨,我有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查询(恕我直言,这是您的解决方案)。