2012-09-06 5 views
1

L'une de nos applications Web, qui fonctionne depuis longtemps dans notre environnement de production, a récemment rencontré une erreur étrange lorsqu'il y a un volume élevé de transactions. Nous n'avons pas pu déterminer quelle était exactement la cause du problème, mais nous avons trouvé des problèmes similaires dans la version précédente, WebSphere 6, liés à un bogue dans la version de Xalan utilisée par le serveur de l'application. En fait, notre serveur d'application est WebSphere 7, qui est supposé l'avoir corrigé, sans compter qu'il n'utilise plus Xalan sous le capot. Notre application n'a pas de pot Xalan intégré aussi. Pour le faire réparer, il suffit de redémarrer l'application elle-même. Une remarque importante est que le document est mis en cache (docs.get (tableName)) et réutilisé pour exécuter l'évaluation XPath. Nous l'avons fait pour éviter le coût d'analyse du document à chaque fois.Erreur inconnue dans XPath

Le code de l'application est

 Document doc = null; 
     try { 
      doc = docs.get(tableName); 

      if (doc == null) 
       return null; 

      XPathFactory xFactory = XPathFactory.newInstance(); 
      XPath xpath = xFactory.newXPath(); 
      XPathExpression expr = xpath.compile(toUpper(xPathQuery)); 
      Object result = expr.evaluate(doc, XPathConstants.NODESET); 

      return (NodeList) result; 
     } catch (XPathExpressionException e) { 
      logger.error("Error executing XPath", e); 
     } 

Et la pile d'erreur est ici

javax.xml.transform.TransformerException: Unknown error in XPath. 
at java.lang.Throwable.<init>(Throwable.java:67) 
at javax.xml.transform.TransformerException.<init>(Unknown Source) 
at org.apache.xpath.XPath.execute(Unknown Source) 
at org.apache.xpath.jaxp.XPathExpressionImpl.evaluate(Unknown Source) 
Caused by: java.lang.NullPointerException 
at org.apache.xerces.dom.ElementNSImpl.getPrefix(Unknown Source) 
at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.processNamespacesAndAttributes(Unknown Source) 
at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.nextNode(Unknown Source) 
at org.apache.xml.dtm.ref.DTMDefaultBase._nextsib(Unknown Source) 
at org.apache.xml.dtm.ref.DTMDefaultBase.getNextSibling(Unknown Source) 
at org.apache.xml.dtm.ref.DTMDefaultBaseTraversers$ChildTraverser.next(Unknown Source) 
at org.apache.xpath.axes.AxesWalker.getNextNode(Unknown Source) 
at org.apache.xpath.axes.AxesWalker.nextNode(Unknown Source) 
at org.apache.xpath.axes.WalkingIterator.nextNode(Unknown Source) 
at org.apache.xpath.axes.NodeSequence.nextNode(Unknown Source) 
at org.apache.xpath.axes.NodeSequence.runTo(Unknown Source) 
at org.apache.xpath.axes.NodeSequence.setRoot(Unknown Source) 
at org.apache.xpath.axes.LocPathIterator.execute(Unknown Source) 
... 16 more 

C'est la question similaire ce que je l'ai mentionné. http://www-01.ibm.com/support/docview.wss?uid=swg1PK42574

Thakns.

+0

Quelle est la valeur de 'xPathQuery'? –

Répondre

1

Beaucoup de gens ne se rendent pas compte que le DOM n'est pas thread-safe (même si vous ne faites que des lectures). Si vous mettez en cache un objet DOM, assurez-vous de synchroniser tous les accès. Franchement, cela rend le DOM inadapté à ce genre d'application. Je sais que je suis partial, mais je suggérerais de passer à Saxon, dont la mise en œuvre native est non seulement beaucoup plus rapide que DOM, mais aussi thread-safe. Un utilisateur a récemment tweeté sur l'obtention d'une amélioration des performances de 100x lorsqu'ils ont effectué ce changement.

+0

J'ai considéré cette possibilité que ce n'est pas thread-safe. Maintenant que je sais, je suis en train de faire une synchronisation pendant que nous regardons Saxon. Synchronized (doc) { result = expr.evaluate (doc, XPathConstants.NODESET); } – user1650564