我有一個servlet通過本地接口調用會話bean。會話方法的最後一個語句與該servlet中該方法調用之後的語句之間存在3秒的暫停。Toplink/Java持久性神祕時間匯
我已經確定什麼語句在會話bean導致在方法返回的額外延遲,但我不知道爲什麼會有這樣的暫停和正在發生的事情:
會話bean的方法:
public void getXMLByDatesPlCtry(PrintWriter out, Date dateStart, Date dateEnd, int plId, String ctry) throws ParserConfigurationException {
Query findCtry = em.createNamedQuery("Ctry.findByCtry");
findCtry.setParameter("ctry", ctry);
Ctry country = (Ctry) findCtry.getSingleResult();
findByDatesPlFcIds = em.createNamedQuery("SortTypeInv.findByDatesPlCtry");
findByDatesPlFcIds.setParameter("dateStart", dateStart);
findByDatesPlFcIds.setParameter("dateEnd", dateEnd);
findByDatesPlFcIds.setParameter("plId", plId);
findByDatesPlFcIds.setParameter("ctry", country);
inventoryList = findByDatesPlFcIds.getResultList(); // statement causing pain
logger.warning("about to return");
}
該servlet調用會話bean:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
[...]
sortTypeInvFacade.getXMLByDatesPlCtry(out, lastSunday.getTime(), yesterday.getTime(), pl_id, request.getParameter("ctry"));
Logger.getLogger(InventoryServlet.class.getName()).warning("just received");
} catch (ParserConfigurationException ex) {
Logger.getLogger(InventoryServlet.class.getName()).log(Level.SEVERE, null, ex);
} finally {
out.close();
}
}
因此,會話bean中的「關於返回」日誌消息與servlet中的「剛剛收到」日誌消息之間發生3秒暫停。如果在某個階段調用導入語句(將數據收集到一個集合中),它只會停留很長時間。真正令人驚訝的是,浪費時間不是花在構建集合上,而是花在方法返回上。在這種情況下,該方法不返回任何內容。
集合是會話類的私有變量還是局部變量不會改變任何內容。使會話bean有狀態或無狀態也一樣。
發生了什麼事?如何避免這種長時間的停頓?
評論說語句刪除秒3的停頓,這正是爲什麼我知道這是哪裏出了問題的來源。 – Gilles 2009-07-30 09:37:50