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