2009-07-30 73 views
0

我有一個servlet通過本地接口調用會話bean。會話方法的最後一個語句與該servlet中該方法調用之後的語句之間存在3秒的暫停。Toplink/Java持久性神祕時間匯

我已經確定什麼語句在會話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有狀態或無狀態也一樣。

發生了什麼事?如何避免這種長時間的停頓?

回答

0

如果不知道自己的完整代碼,很難回答。

我想它可能與從會話bean退出時提交的事務有關,也可能是從會話bean退出後執行的一些攔截器。

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

+0

評論說語句刪除秒3的停頓,這正是爲什麼我知道這是哪裏出了問題的來源。 – Gilles 2009-07-30 09:37:50

0

我的猜測是你有一個巨大的垃圾收集觸發。嘗試啓用允許您關注垃圾回收的標誌。

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

+0

我遵循你的建議,但垃圾收集不是答案,花在它上的時間非常短。 – Gilles 2009-07-30 10:07:35