2012-11-06 81 views
1

嗨我有谷歌應用程序引擎應用程序。我使用JPA和簡單的servlet和jsp。GAE商店分貝,但不顯示在視圖

我的代碼:

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上存儲記錄和顯示之間會延遲幾秒鐘。

問題在哪裏?

回答

1

你遇到的是一個名爲eventual consistency的數據存儲屬性。

基本上發生的是這樣的:當您將數據寫入HRD時,它將數據寫入表中,然後在構建索引之前返回(=索引是異步構建的)。由於查詢需要索引,所以直到構建索引時纔會發現新寫入的數據。

解決方案(在上面的鏈接閱讀更多關於它):

  1. 使用獲得的,而不是查詢。獲得總是強烈一致的。重新構造您的應用程序,以便將新保存的數據的關鍵字傳遞給視圖JSP,像往常一樣執行查詢,然後通過get將新寫入的數據添加到列表中。
  2. 使用鏈接中描述的祖先查詢(imho,在你的情況是一個不好的解決方案)。
相關問題