Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB和XSLT性能_Java_Xslt_Jaxb_Marshalling_Unmarshalling - Fatal编程技术网

Java JAXB和XSLT性能

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

我有以下代码来执行从一个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();
如果使用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气象服务的输出


注意:我是专家组的负责人和成员

替代方法

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


不太清楚模板实例javax.xml.transform.Templates是什么意思。用于将XSLT文档缓存为内存中的Java对象。感谢您提供有关模板的提示。我确实有一个用例,我会一遍又一遍地使用我的模板。我不太清楚你所说的模板实例javax.xml.transform.templates是什么意思。用于将XSLT文档缓存为内存中的Java对象。感谢您提供有关模板的提示。实际上,我有一个用例,我会反复使用我的模板。我想知道我是否也应该实现一些封送器和解封器池,但是它们对于createYeap来说不应该太昂贵,事实上,我的JaxbUtils类提供了JAXBContext缓存。我想知道是否也应该实现一些封送器和解封器池,但它们的创建成本不应该太高