[英]Toplink/java persistency mystery time sink
我有一個Servlet通過本地接口調用會話bean。 會話方法的最后一條語句和Servlet中該方法調用之后的語句之間有3秒的暫停。
我已經確定了會話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有狀態或無狀態也是如此。
怎么了? 如何避免這么長時間的停頓?
不知道完整的代碼就很難回答。
我想這可能與從會話bean退出時提交的事務有關,或者與從會話bean退出后正在執行的某些攔截器有關。
另外,我會嘗試注釋掉.getResultSet()調用以查看它是否有任何效果。
我的猜測是您觸發了一個巨大的垃圾回收。 嘗試啟用允許您跟蹤垃圾回收的標志。
對於Sun JVM,這似乎是-verbose:gc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.