簡體   English   中英

Toplink / java持久性神秘時間沉

[英]Toplink/java persistency mystery time sink

我有一個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");
}

Servlet調用會話Bean:

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有狀態或無狀態也是如此。

怎么了? 如何避免這么長時間的停頓?

不知道完整的代碼就很難回答。

我想這可能與從會話bean退出時提交的事務有關,或者與從會話bean退出后正在執行的某些攔截器有關。

另外,我會嘗試注釋掉.getResultSet()調用以查看它是否有任何效果。

我的猜測是您觸發了一個巨大的垃圾回收。 嘗試啟用允許您跟蹤垃圾回收的標志。

對於Sun JVM,這似乎是-verbose:gc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM