0

我有一个通过本地接口调用会话 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 有状态或无状态也是如此。

怎么了?如何避免这种长时间的停顿?

4

2 回答 2

0

不知道您的完整代码很难回答。

我猜它要么与从会话 bean 退出时提交的事务有关,要么与从会话 bean 退出后执行的某些拦截器有关。

另外我会尝试注释掉 .getResultSet() 调用,看看它是否有任何效果。

于 2009-07-30T09:30:29.633 回答
0

我的猜测是你触发了一个巨大的垃圾收集。尝试启用允许您跟踪垃圾回收的标志。

对于 Sun JVM,这似乎是 -verbose:gc

于 2009-07-30T09:35:41.090 回答