1

我们的一个 Web 应用程序已经在我们的生产环境中运行了很长时间,最近它在处理大量事务时遇到了一个奇怪的错误。我们无法弄清楚问题的根本原因是什么,但我们在之前的版本 WebSphere 6 中发现了一些类似的问题,这些问题与应用服务器使用的 Xalan 版本中的一个错误有关。我们的应用程序服务器实际上是 WebSphere 7,除了它不再使用 Xalan 之外,它应该已经修复了。我们的应用程序也没有嵌入 Xalan jar。要修复它,我们只需重新启动应用程序本身。一个重要的注意事项是文档正在被缓存 (docs.get(tableName)) 并被重用于执行 XPath 评估。我们这样做是为了避免每次解析文档的成本。

应用程序代码是

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

错误堆栈在这里

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

这是我提到的类似问题。 http://www-01.ibm.com/support/docview.wss?uid=swg1PK42574

塔肯斯。

4

1 回答 1

1

许多人没有意识到 DOM 不是线程安全的(即使您只是在进行读取)。如果要缓存 DOM 对象,请确保同步对它的所有访问。

坦率地说,这使得 DOM 不适合这种应用程序。我知道我有偏见,但我建议切换到 Saxon,它的原生树实现不仅比 DOM 快得多,而且是线程安全的。一位用户最近在推特上说,当他们进行此切换时,性能提高了 100 倍。

于 2012-09-06T10:18:38.823 回答