5

ここから、 org.w3c.dom.Node(および同じパッケージ内の他のクラス)がスレッドセーフではないことを学びました。

これらのクラスをキャッシュする必要があるかどうか、またどのようにキャッシュする必要があるかを自問しています。

  • 最善のアプローチはありますか?
  • 不変のラッパー クラスは存在しますか?
  • 代わりThreadLocalDocumentBuilder/を使用して毎回 再作成する必要がありますか?DocumentBuilderFactory
    Node
  • 職業はなんですか?
4

3 に答える 3

1

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

(複数のスレッドから同じドキュメントを解析することによる同時実行の問題を超えた)1つの利点は、構成のXML形式に縛られないことです。すべての構成がプロパティファイルにどのように含まれていたかを考えてみてください。その後、XMLが登場し、すべてのオープンソースパッケージがXMLのサポートを追加しました。その後、注釈が付けられ、それもサポートされました。Hibernateはその良い例です。

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

于 2012-05-11T12:28:15.213 に答える
1

唯一の選択肢は、ドキュメント/ノードへのすべてのアクセスを同期することです。適切にカプセル化されている場合 (DOM オブジェクトが単一のクラスによって維持され、すべての DOM 操作がそのクラス内にある場合)、そのエントリ ポイント クラスを同期するだけです。ノードが他のオブジェクト間で渡される場合、大きな問題が発生します。基本的に、「ロック」クラスとなる単一のオブジェクトを決定し、構成ファイルノードへのすべてのアクセスを同期する必要があります。

于 2012-05-12T17:21:11.910 に答える
0

申し訳ありませんが、これは実際には答えではありませんが、ユースケースが複数のスレッド間で共有される構成ファイル モデルである場合。書き込みは構成のどこで行われますか。一度読んで何度も使うなら、同期はいらないですよね?ここで何か不足していますか?

于 2012-05-12T16:57:10.017 に答える