2009-07-30 5 views
0

У меня есть сервлет, вызывающий сессионный компонент через локальный интерфейс. Существует 3-секундная пауза между последней инструкцией метода сеанса и оператором, следующим за вызовом метода в сервлете.Toplink/java persistency mystery time sink

Я определил, что утверждение в сессионный компонент вызывает дополнительную задержку по возвращении метода, но я просто понятия не имею, почему существует такая пауза, и то, что происходит:

метод сессионного компонента:

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"); 
} 

сервлет вызова компонента сеанса:

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 секунды происходит между сообщением журнала «о возврате» в сеансовом компоненте и «только что полученным» сообщением журнала в сервлете. Это делает только длинную паузу, если на какой-то стадии вызывается инкриминирующее утверждение (сбор данных в коллекцию). Что действительно удивительно, так это то, что потраченное время не тратится на сбор коллекции, а скорее на возврат метода. И в этом случае метод ничего не возвращает.

Независимо от того, является ли коллекция частной переменной класса сеанса или локальной переменной, ничего не меняет. То же самое происходит с установкой сессионного компонента с состоянием или без сохранения состояния.

Что происходит? Как можно избежать такой долгой паузы?

ответ

0

Трудно ответить, не зная полного кода.

Я бы предположил, что это связано либо с транзакцией, совершенной при выходе из сеансового компонента, либо, может быть, с некоторыми перехватчиками, которые выполняются после выхода из сеансового компонента.

Также я попытался бы прокомментировать вызов .getResultSet(), чтобы увидеть, имеет ли он эффект.

+0

Комментируя это заявление снимает паузу на 3 секунды, что именно поэтому я знаю, что это, где проблема приходит. – Gilles

0

Я предполагаю, что у вас есть огромная сборка мусора. Попробуйте включить флаг, который позволит вам следить за сборками мусора.

Для Sun JVM это, кажется, -verbose: дс

+0

Я следил за твоим советом, но сбор мусора - это не ответ, время, проведенное на нем, было очень маленьким. – Gilles

+0

В этом случае прикрепите jvisualvm и дайте ему профайл приложения. –