Toplink / Java стойкость тайна время утечки - PullRequest
0 голосов
/ 30 июля 2009

У меня есть сервлет, вызывающий сессионный компонент через локальный интерфейс. Существует 3-секундная пауза между последним оператором метода сеанса и оператором после этого вызова метода в сервлете.

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 30 июля 2009

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

Для Sun JVM это выглядит как -verbose: gc

0 голосов
/ 30 июля 2009

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

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

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

...