Ich habe ein Servlet eine Session-Bean über eine lokale Schnittstelle aufrufen. Zwischen der letzten Anweisung der Sitzungsmethode und der Anweisung, die auf diesen Methodenaufruf im Servlet folgt, gibt es eine Pause von 3 Sekunden.Toplink/Java Persistenz Geheimnis Zeit sinken
Ich habe erkannt, welche Anweisung in der Session Bean auf Verfahren Rückkehr die zusätzliche Verzögerung verursacht, aber ich habe keine Ahnung, warum es eine solche Pause ist und was geschieht:
Die Session-Bean-Methode:
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");
}
Das Servlet Aufruf der Session-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();
}
}
Die 3-Sekunden-Pause findet also zwischen der Protokollnachricht "fast to return" in der Session-Bean und der Protokollnachricht "just received" im Servlet statt. Es macht nur diese lange Pause, wenn irgendwann die belastende Aussage (Sammeln von Daten in eine Sammlung) aufgerufen wird. Was wirklich überraschend ist, ist, dass die verschwendete Zeit nicht mit dem Erstellen der Sammlung verbracht wird, sondern eher mit der Rückgabe der Methode. Und in diesem Fall wird von der Methode nichts zurückgegeben.
Ob die Auflistung eine private Variable der Sitzungsklasse oder eine lokale Variable ist, ändert nichts. Gleiches gilt für die Stateful oder Stateless Session-Bean.
Was passiert? Wie kann diese lange Pause vermieden werden?
kommentierte, dass Anweisung entfernt die 3 Sekunden Pause, das genau ist, warum ich weiß, dass das ist, wo das Problem herkommt. – Gilles