2012-05-11 16 views
3

からhereorg.w3c.dom.Node(と同じパッケージ内の他のクラス)はスレッドセーフではないことを知りました。org.w3c.dom.Nodeの並行性と再利用

これらのクラスをキャッシュする必要があるかどうか、どうすればよいですか?

  • 最良の方法はありますか?
  • 不変のラッパークラスが存在しますか?
  • 私は
    代わりDocumentBuilder/DocumentBuilderFactoryためThreadLocalを使用してNode毎回を再作成する必要がありますか?
  • あなたは何をしていますか?
+0

いつ、複数のスレッドが同じ 'Document'(' Node'はもちろん)を扱う状況になるのですか? –

+0

サーブレットによって(間接的に)読み取られる構成ファイルを想像してください。 – MRalwasser

+0

そのファイルのようなサウンドは、一度解析してよりアクセシビリティの良い形式に変換する必要があります。 –

答えて

1

XMLドキュメントをキャッシュしたくありません。それを「構成」オブジェクトに読み込み/解析する方が良いでしょう。構成の複雑さや単純さによっては、単純なマップやもっと複雑なものになる可能性があります。

複数のスレッドから同じドキュメントを解析することによる並行性の問題を超える利点の1つは、構成のXML形式に縛られていないことです。すべての設定がプロパティファイルにどのように使われていたのかを考えてみましょう。その後、XMLが公開され、すべてのオープンソースパッケージにXMLのサポートが追加されました。その後、アノテーションが来て、それもサポートされました。休止状態はその良い例です。

あなたがしたいのは、設定ファイルを解析し、結果の設定オブジェクトをソースXMLではなくキャッシュに保存することです。

+0

私は同意します。しかし、私はxpath表現を使えないレガシーシステムをサポートしなければなりませんモデルクラス/アンマーシャリングされたJAXP beanに容易にリファクタリングできます( – MRalwasser

0

残念ながら、これは実際の回答ではありませんが、usecaseが複数のスレッドで共有される構成ファイルモデルである場合は、書き込みはどこで設定に行われますか?一度読んで複数回使用すると、同期は必要ありませんか?ここに何かがないのですか?

+1

)。はい、安全に複数のスレッドからDOMオブジェクトを読み込むことはできません。 _reading_でもスレッドセーフではありません。 – jtahlborn

+0

興味深い。これを説明するいくつかのリソースを指すことができますか?ありがとう – Ravi

+0

あなたは質問のリンクのような意味ですか? – jtahlborn

1

唯一の選択は、ドキュメント/ノードへのすべてのアクセスを同期させることです。 DOMオブジェクトが1つのクラスによってメンテナンスされ、すべてのDOM操作がそのクラス内にある場合は、そのエントリポイントクラスを同期させるだけで済みます。ノードが他のオブジェクトの中に渡された場合、大きな問題があります。あなたは基本的に、あなたの "ロック"クラスである単一のオブジェクトを決定し、その上ですべてコンフィグファイルノードへのアクセスを同期させる必要があります。