2009-07-30 7 views
0

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?

Antwort

0

Es ist schwer zu beantworten, ohne Ihren vollständigen Code zu kennen.

Ich würde vermuten, dass es sich entweder um eine Transaktion handelt, die beim Beenden der Session-Bean festgeschrieben wurde, oder vielleicht um einige Interceptors, die nach dem Beenden der Session-Bean ausgeführt werden.

Auch ich würde versuchen, den .getResultSet() -Aufruf zu kommentieren, um zu sehen, ob es irgendeine Wirkung hat.

+0

kommentierte, dass Anweisung entfernt die 3 Sekunden Pause, das genau ist, warum ich weiß, dass das ist, wo das Problem herkommt. – Gilles

0

Meine Vermutung ist, dass Sie eine riesige Müllsammlung ausgelöst haben. Aktivieren Sie das Flag, mit dem Sie Garbage Collections verfolgen können.

Für die Sun JVM erscheint diese -verbose zu sein: gc

+0

Ich habe Ihren Rat befolgt, aber Müllabfuhr ist nicht die Antwort, die Zeit dafür war sehr klein. – Gilles

+0

Hängen Sie in diesem Fall jvisualvm an und lassen Sie Ihre Anwendung profilieren. –