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