org.w3c.dom.Node的并发和重用

时间:2012-05-11 11:58:33

标签: java xml multithreading caching

here我了解到org.w3c.dom.Node(以及同一个包中的其他类)不是线程安全的。

我问自己是否以及如何缓存这些类?

  • 有最佳方法吗?
  • 是否存在不可变的包装类?
  • 我应该使用ThreadLocal代替DocumentBuilder / DocumentBuilderFactory 并每次重新创建Node
  • 你做什么?

3 个答案:

答案 0 :(得分:1)

您不想缓存XML文档。最好将其解析/解析为“配置”对象。根据您的配置的复杂程度或简单程度,它可能是一个简单的Map或更复杂的东西。

除了从多个线程解析相同doc的并发问题之外,一个好处是您不依赖于配置的XML格式。考虑一下所有configs曾经在属性文件中的表现,然后出现了XML,每个开源软件包都添加了对XML的支持。然后注释来了,那也得到了支持。 Hibernate就是一个很好的例子。

您要做的是解析配置文件并将生成的配置对象保留在缓存中而不是源XML中。

答案 1 :(得分:1)

您唯一的选择是同步对文档/节点的所有访问。如果它被很好地封装(DOM对象由单个类维护并且所有DOM操作都在该类中),那么您可以只同步该入口点类。如果节点在其他对象中传递,则存在重大问题。您基本上需要决定一个单独的对象,它将是您的“锁定”类,并围绕所有访问配置文件节点进行同步。

答案 2 :(得分:0)

很抱歉这不是一个真正的答案,但是如果用例是要在多个线程之间共享的配置文件模型。写入发生在配置的哪里。如果多次读取和使用,您不需要同步吗?我在这里错过了什么吗?