2009-07-30 7 views
0

J'ai une servlet qui appelle un bean session via une interface locale. Il y a une pause de 3 secondes entre la dernière instruction de la méthode de session et l'instruction qui suit cet appel de méthode dans la servlet.Toplink/java persistency mystery time sink

J'ai identifié ce que la déclaration du bean session provoque le retard supplémentaire lors du retour de la méthode, mais je n'ai aucune idée pourquoi il y a une telle pause et ce qui se passe:

La méthode de bean session:

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"); 
} 

le servlet appelant bean session:

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(); 
    } 
} 

La pause de 3 secondes se produit donc entre le message de journal "sur le point de retourner" dans le bean de session et le message de journal "juste reçu" dans le servlet. Il ne fait qu'une longue pause si, à un moment donné, l'instruction incriminante (collecte de données dans une collection) est appelée. Ce qui est vraiment surprenant, c'est que le temps perdu n'est pas consacré à la construction de la collection, mais plutôt au retour de la méthode. Et dans ce cas, rien n'est retourné par la méthode. Si la collection est une variable privée de la classe de session ou une variable locale, elle ne change rien. Il en va de même pour rendre le bean session stateful ou apatride.

Que se passe-t-il? Comment cette longue pause peut-elle être évitée?

Répondre

0

Il est difficile de répondre sans connaître votre code complet.

Je suppose que c'est lié à la transaction qui est validée lors de la sortie du bean session, ou peut-être à certains intercepteurs qui s'exécutent après la sortie du bean session.

Aussi, je voudrais essayer de commenter l'appel .getResultSet() pour voir si elle a un effet.

+0

Commentant cette déclaration supprime les 3 secondes de pause, c'est précisément la raison pour laquelle je sais que c'est là le problème vient. – Gilles

0

Je suppose que vous avez une énorme collecte de place déclenchée. Essayez d'activer l'indicateur qui vous permet de suivre les collectes de place.

Pour la machine virtuelle Java Sun cela semble être -verbose: gc

+0

J'ai suivi votre conseil, mais la collecte des ordures n'est pas la solution, le temps passé dessus était très petit. – Gilles

+0

Dans ce cas, joignez jvisualvm et laissez-le profiler votre application. –