【问题标题】:Toplink/java persistency mystery time sinkToplink/java持久化之谜时间汇
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 评论该语句消除了 3 秒的停顿,这正是我知道问题所在的原因。
    【解决方案2】:

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

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

    【讨论】:

    • 我听从了你的建议,但垃圾回收不是答案,花费的时间非常少。
    • 在这种情况下,附加 jvisualvm 并让它分析您的应用程序。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多