Toplink / java persistency神秘时间下沉

时间:2009-07-30 08:40:27

标签: java java-ee persistence toplink

我有一个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设置为有状态或无状态也是如此。

发生了什么事?如何避免长时间停顿?

2 个答案:

答案 0 :(得分:0)

如果不知道完整的代码,很难回答。

我猜它与从会话bean退出时提交的事务有关,或者可能是在从会话bean退出后执行的一些拦截器。

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

答案 1 :(得分:0)

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

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