【发布时间】:2023-03-24 20:47:01
【问题描述】:
我有一个通过本地接口调用会话 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 中的“刚刚收到”日志消息之间。它只会在某些情况下进行长时间的暂停stage 调用有罪陈述(将数据收集到集合中)。真正令人惊讶的是,浪费的时间不是花在构建集合上,而是花在方法返回上。在这种情况下,该方法不会返回任何内容。
无论集合是会话类的私有变量还是局部变量都不会改变任何东西。使会话 bean 有状态或无状态也是如此。
发生了什么?如何避免这种长时间的停顿?
【问题讨论】:
标签: java jakarta-ee persistence toplink