【问题标题】:JAXB and XSLT performanceJAXB 和 XSLT 性能
【发布时间】:2012-11-28 14:02:45
【问题描述】:

我有以下代码来执行从一个 JAXB 注释对象到另一个 JAXB 注释对象的 XSLT 转换。在这种情况下,性能真的会很差吗?它会将 JAXB 对象编组为 XML,将其转换为另一个 XML 并解组,还是这里有更好的技巧?

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(mapping.getInputStream()));
JAXBResult result = new JAXBResult(JaxbUtils.getJAXBContext(CalypsoUploadDocument.class));
transformer.transform(new JAXBSource(JaxbUtils.getJAXBContext(CalypsoUploadDocument.class), uploadMessage),result);

return result.getResult();

【问题讨论】:

    标签: java xslt jaxb marshalling unmarshalling


    【解决方案1】:

    如果使用 Java 6(我的生产经验基于 Oracle JDK),这也是我们采用的有效方法。性能相当不错。一个小的改进是使用模板实例。

    另一方面,如果您的应用程序有一个或几个转换并且转换本身不会随着时间而改变,我不推荐这种方法。然后直接的方法要快得多(java实例-> java映射-> java实例)

    【讨论】:

    • 不太清楚你所说的模板实例是什么意思
    • javax.xml.transform.Templates。用于将 XSLT 文档缓存为内存中的 Java 对象。
    • 感谢您对模板的提示。实际上,我确实有一个用例,我会一遍又一遍地使用我的模板。
    【解决方案2】:

    这取决于 XSLT 处理器。 Saxon 的商业版可以在流模式下做一些转换。 JAXBSource 扩展 SAXSource 并且也适用于事件流。对于更复杂的转换或使用其他 XSLT 处理器,实现可能首先创建一个内部树状结构。这种结构通常比 DOM 树更优化,性能更好,请参阅Comparing DOM and other object models 了解一些基准。最好自己对代码进行基准测试或分析,看看性能是否可以接受。

    请注意您的代码,JAXBContext 的创建成本很高,应该在应用程序的整个生命周期内进行缓存。如果您的 JaxbUtils 类还没有这样做,那么重用上下文可以很好地提升性能。

    【讨论】:

    • 是的,我的 JaxbUtils 类确实提供了 JAXBContext 缓存。我想知道是否也应该实现一些编组器和解组器的池化,但创建它们的成本不应该那么高
    【解决方案3】:

    注意:我是EclipseLink JAXB (MOXy) 领导,也是JAXB (JSR-222) 专家组的成员。

    替代方法

    如果您碰巧使用 MOXy 作为您的 JAXB 提供程序,那么您可以拥有一个映射到两个 XML 模式的 Java 模型。您可以使用标准 JAXB (JSR-222) 注释映射到第一个,并使用 MOXy 的外部映射文档映射到第二个。下面是我博客的链接,我使用这种方法将一个对象模型映射到 Google 和 Yahoo 天气服务的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多