我有一个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");
}
调用会话bean的servlet:
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设置为有状态或无状态也是如此。
发生了什么事?如何避免长时间停顿?
答案 0 :(得分:0)
如果不知道完整的代码,很难回答。
我猜它与从会话bean退出时提交的事务有关,或者可能是在从会话bean退出后执行的一些拦截器。
此外,我会尝试注释掉.getResultSet()调用以查看它是否有任何效果。
答案 1 :(得分:0)
我的猜测是你有一个巨大的垃圾收集触发。尝试启用允许您跟踪垃圾收集的标志。
对于Sun JVM,这似乎是-verbose:gc