1

実稼働環境で長い間実行されている Web アプリケーションの 1 つですが、ごく最近では、大量のトランザクションがあるときに奇妙なエラーが発生しています。問題の根本的な原因を正確に突き止めることはできませんでしたが、以前のバージョンである WebSphere 6 で、アプリ サーバーで使用される Xalan バージョンのバグに関連するいくつかの同様の問題が見つかりました。私たちのアプリケーション サーバーは実際には WebSphere 7 であり、内部で Xalan を使用していないことに加えて、修正されているはずです。私たちのアプリケーションには Xalan jar も埋め込まれていません。修正するには、アプリケーション自体を再起動するだけです。重要な注意事項の 1 つは、Document がキャッシュされ (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 オブジェクトへのすべてのアクセスを同期するようにしてください。

率直に言って、DOM はこの種のアプリケーションには不向きです。私が偏見を持っていることは承知していますが、ネイティブ ツリーの実装が DOM よりもはるかに高速であるだけでなく、スレッド セーフでもある Saxon に切り替えることをお勧めします。あるユーザーは最近、この切り替えを行ったときにパフォーマンスが 100 倍向上したとツイートしました。

于 2012-09-06T10:18:38.823 に答える