我有一个通过本地接口调用会话 bean 的 servlet。在会话方法的最后一条语句和 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();
}
}
因此 3 秒的暂停发生在会话 bean 中的“即将返回”日志消息和 servlet 中的“刚刚收到”日志消息之间。如果在某个阶段调用了有罪的语句(将数据收集到集合中),它只会暂停那么长时间。真正令人惊讶的是,浪费的时间不是花在构建集合上,而是花在方法返回上。在这种情况下,该方法不会返回任何内容。
集合是会话类的私有变量还是局部变量都不会改变任何东西。使会话 bean 有状态或无状态也是如此。
怎么了?如何避免这种长时间的停顿?