【问题标题】:Creating a DOM that is thread safe for read operations为读操作创建一个线程安全的 DOM
【发布时间】:2010-12-03 00:55:20
【问题描述】:

我的应用程序由多个 xml 源组成一个网页模型。使用普通 Xerces 解析器将这些源作为 DOM 对象解析到内存中。不幸的是,Xerces DOM 对象对于只读操作不是线程安全的。我希望能够重用解析的 DOM 进行读取。有谁知道我使用的另一个解析器或一个简单的线程安全的读取 DOM 实现?

【问题讨论】:

    标签: java thread-safety xerces


    【解决方案1】:

    我不知道任何完美而简单的解决方案。

    一个想法可能是使用线程安全对象重新创建 Dom

    在这种情况下,它们最好是不可变的,因为您是只读的。 不可变也为进一步改进提供了可能性(例如,实例共享将导致更小的内存占用)。

    我希望我可以推荐一个这样做的库,因为它需要大量的编码......

    【讨论】:

      【解决方案2】:

      Saxon 为其内部和不可变的数据结构提供 DOM 包装器。

      // create Saxon IdentityTransformer
      final Transformer transformer = new TransformerFactoryImpl().newTransformer();
      
      // set up holder for the output
      final TinyBuilder outputTarget = new TinyBuilder(
          new PipelineConfiguration(new Configuration()));
      
      // transform into Saxon's immutable TinyTree
      transformer.transform(xml, outputTarget);
      
      // extract the whole XML as TinyNode 
      final TinyNodeImpl tinyNode = outputTarget.getTree().getNode(0);
      
      // wrap TinyNode as DOM
      final NodeOverNodeInfo nodeOverNodeInfo = DocumentOverNodeInfo.wrap(tinyNode);
      
      // cast to DOM
      final Document doc = (Document) nodeOverNodeInfo;
      

      (用 saxon-he 9.5.1 测试)

      【讨论】:

        猜你喜欢
        • 2012-04-01
        • 1970-01-01
        • 2010-12-23
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-16
        • 2013-10-09
        相关资源
        最近更新 更多