28
  1. XML 処理用の Java API である JAXPを使用する場合に (同じドキュメントまたは別のドキュメントで)再利用できるオブジェクトを知りたいです。

    • DocumentBuilderFactory
    • DocumentBuilder
    • XPath
    • Node
    • ErrorHandler(編集:これを自分のコードに実装する必要があることを忘れていました、ごめんなさい)
  2. これらのオブジェクトをキャッシュすることをお勧めしますか、それとも JAXP 実装で既にそれらをキャッシュしていますか?

  3. これらのオブジェクトの(再) 使用はスレッドセーフですか?

4

1 に答える 1

31

再利用

同じスレッドで、これらのオブジェクトを再利用できますし、再利用する必要があります。たとえば、DocumentBuilder を使用して複数のドキュメントを解析できます。

スレッドセーフ

DocumentBuilderFactory は、スレッドセーフではないと明示的に述べていましたが、これは今でも真実だと思います。

DocumentBuilderFactory クラスの実装は、スレッドセーフであるとは限りません。複数のスレッドからの DocumentBuilderFactory の使用を確認するのは、ユーザー アプリケーション次第です。

スタック オーバーフローによると、DocumentBuilder もスレッド セーフではないようです。ただし、Java SE 5 では、リセット メソッドが追加され、DocumentBuilder を再利用できるようになりました。

Javadoc からの XPath はスレッドセーフではありません

XPath オブジェクトはスレッドセーフではなく、再入可能ではありません。つまり、1 つの XPath オブジェクトが常に複数のスレッドから使​​用されていないことを確認するのはアプリケーションの責任であり、evaluate メソッドが呼び出されている間、アプリケーションは evaluate メソッドを再帰的に呼び出すことはできません。

ノードはスレッド セーフではありません (Xerces Web サイトより)

Xerces DOM 実装はスレッドセーフですか? いいえ。DOM では、実装がスレッド セーフである必要はありません。複数のスレッドから DOM にアクセスする必要がある場合は、適切なロックをアプリケーション コードに追加する必要があります。

ErrorHandler はインターフェースであるため、スレッドセーフを保証するのはそのインターフェースの実装次第です。スレッドセーフに関するポインタについては、ここから始めることができます:

于 2010-08-09T17:47:07.640 に答える