XML 処理用の Java API である JAXPを使用する場合に (同じドキュメントまたは別のドキュメントで)再利用できるオブジェクトを知りたいです。
DocumentBuilderFactory
DocumentBuilder
XPath
Node
(編集:これを自分のコードに実装する必要があることを忘れていました、ごめんなさい)ErrorHandler
これらのオブジェクトをキャッシュすることをお勧めしますか、それとも JAXP 実装で既にそれらをキャッシュしていますか?
これらのオブジェクトの(再) 使用はスレッドセーフですか?
1 に答える
再利用
同じスレッドで、これらのオブジェクトを再利用できますし、再利用する必要があります。たとえば、DocumentBuilder を使用して複数のドキュメントを解析できます。
スレッドセーフ
DocumentBuilderFactory は、スレッドセーフではないと明示的に述べていましたが、これは今でも真実だと思います。
DocumentBuilderFactory クラスの実装は、スレッドセーフであるとは限りません。複数のスレッドからの DocumentBuilderFactory の使用を確認するのは、ユーザー アプリケーション次第です。
スタック オーバーフローによると、DocumentBuilder もスレッド セーフではないようです。ただし、Java SE 5 では、リセット メソッドが追加され、DocumentBuilder を再利用できるようになりました。
- DocumentBuilder.parse() はスレッドセーフですか?
- http://download-llnw.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilder.html#reset()
- http://www.junlu.com/msg/289939.html (DocumentBuilder.reset()について)
Javadoc からの XPath はスレッドセーフではありません
XPath オブジェクトはスレッドセーフではなく、再入可能ではありません。つまり、1 つの XPath オブジェクトが常に複数のスレッドから使用されていないことを確認するのはアプリケーションの責任であり、evaluate メソッドが呼び出されている間、アプリケーションは evaluate メソッドを再帰的に呼び出すことはできません。
ノードはスレッド セーフではありません (Xerces Web サイトより)
Xerces DOM 実装はスレッドセーフですか? いいえ。DOM では、実装がスレッド セーフである必要はありません。複数のスレッドから DOM にアクセスする必要がある場合は、適切なロックをアプリケーション コードに追加する必要があります。
ErrorHandler はインターフェースであるため、スレッドセーフを保証するのはそのインターフェースの実装次第です。スレッドセーフに関するポインタについては、ここから始めることができます: