Java JAXB和XSLT性能
我有以下代码来执行从一个JAXB注释对象到另一个JAXB注释对象的XSLT转换。在这种情况下,性能真的会很差吗?它是否将JAXB对象转换为XML,将其转换为另一个XML并解组,或者这里有更好的技巧吗Java JAXB和XSLT性能,java,xslt,jaxb,marshalling,unmarshalling,Java,Xslt,Jaxb,Marshalling,Unmarshalling,我有以下代码来执行从一个JAXB注释对象到另一个JAXB注释对象的XSLT转换。在这种情况下,性能真的会很差吗?它是否将JAXB对象转换为XML,将其转换为另一个XML并解组,或者这里有更好的技巧吗 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(new StreamSource
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();
如果使用Java6(我的生产经验是基于OracleJDK的),这也是一种有效的方法。性能相当好。一个小的改进是使用模板实例
另一方面,如果您的应用程序有一个或几个转换,并且转换本身不会随着时间的推移而改变,那么我不推荐这种方法。如果使用java 6(我的生产经验基于Oracle JDK),那么直接方法的速度要快得多(java实例->java映射->java实例),这也是一种有效的方法。性能相当好。一个小的改进是使用模板实例
另一方面,如果您的应用程序有一个或几个转换,并且转换本身不会随着时间的推移而改变,那么我不推荐这种方法。那么直接方法要快得多(java实例->java映射->java实例)这取决于XSLT处理器。Saxon的商业版本可以在流模式下进行一些转换
JAXBSource
扩展了SAXSource
,因此也适用于事件流。对于更复杂的转换或其他XSLT处理器,实现可能首先创建一个内部树状结构。这种结构通常比DOM树更优化,性能更好,请参阅以获取一些基准测试。最好是自己对代码进行基准测试或评测,看看性能是否可以接受
关于代码的一个注意事项是,
JAXBContext
的创建成本很高,应该在应用程序的生命周期内进行缓存。如果您的JaxbUtils
类还没有做到这一点,那么重用上下文可以提高性能。这取决于XSLT处理器。Saxon的商业版本可以在流模式下进行一些转换JAXBSource
扩展了SAXSource
,因此也适用于事件流。对于更复杂的转换或其他XSLT处理器,实现可能首先创建一个内部树状结构。这种结构通常比DOM树更优化,性能更好,请参阅以获取一些基准测试。最好是自己对代码进行基准测试或评测,看看性能是否可以接受
关于代码的一个注意事项是,
JAXBContext
的创建成本很高,应该在应用程序的生命周期内进行缓存。如果您的JaxbUtils
类还没有做到这一点,那么重用上下文可以大大提高性能。注意:我是该专家组的负责人和成员
替代方法
如果您碰巧使用MOXy作为JAXB提供者,那么您可以拥有一个映射到两个XML模式的Java模型。可以使用标准JAXB(JSR-222)注释映射到第一个,使用MOXy的外部映射文档映射到第二个。下面是我的博客链接,我使用这种方法将一个对象模型映射到Google和Yahoo气象服务的输出