使用jaxb进行XSLT处理以实现小的转换性能

时间:2015-05-30 09:52:13

标签: java performance jaxb xslt-1.0

我有一个简单的转变。我有一个java对象转换成不同的java对象。所以我使用了xslt。 jaxb是我的处理器。

TransformerFactory transformerFactory = TransformerFactory.newInstance();
            StreamSource streamSource = new StreamSource(
                    new File("conv.xsl"));
            Transformer transformer = transformerFactory.newTransformer(streamSource);
            JAXBContext jc =JAXBContext.newInstance(Bags.class);
            JAXBSource jAXBSource = new JAXBSource(jc, device);
 jAXBResult = new JAXBResult(JAXBContext.newInstance(LargeBags.class));

            transformer.transform(jAXBSource, jAXBResult);

return result.getResult();

在性能视角中可以这样做吗?我可以用java代码做到这一点。这是一个很大的性能问题吗?还是一个好习惯?请帮助我,感谢您的意见。除此之外如果我有小分组和计算是xslt是一个很好的方法?

1 个答案:

答案 0 :(得分:0)

从性能的角度来看,它当然不是最优的:序列化为xml,xml的转换,xml的反序列化是昂贵的操作。 但是,它有时是有意义的,如果你有很多“相似”类(例如不同的字段名称但匹配逻辑(例如一个具有用户其他人字段等),因为编辑xslt表以提供工具转换更快更容易而不是创建新的Adapter类。

但你绝对应该加快速度,

创建jaxbContext一次,而不是每次调用,创建JAXB上下文是非常昂贵的操作。例如,将它存储在映射中,其中键是用于JaxbCreation的类:

protected static $_views = array(
    'hugot_summary' => array(
        'columns' => array(
            'id',
            'user_id',
            'photo_id',
            'hugot',
            'url',
            'comment_count',
            'upvotes',
            'created_at',
            'updated_at'
        ),
    ),
);

同样的伎俩,变形金刚。

请记住变压器不是线程安全的,所以你需要 如果您的应用程序是多线程的,请在使用前在变换器上进行同步。