如何防止Apache CXF将原始数据转换为对象类型?

时间:2009-06-07 19:05:56

标签: java web-services cxf

我正在为一个项目评估Apache CXF,所以我写了一个小的演示应用程序来尝试一些事情。按照CXF用户指南,我能够快速启动并运行我的应用程序。

我想测试的一件事是CXF能够处理返回大量基元的方法。所以我定义了一个方法'float[] getRandFloats(int count)',它只返回一个用随机数填充的指定长度的数组。查看由java2wsdl生成的WSDL,我看到该方法正确地指示了float[]的返回类型。检查客户端,我也看到我(最终)收到float[]

我注意到随着我增加数组中的元素数量,客户端性能会受到影响。我在客户端运行了一个分析器,看到为返回的数组中的每个元素创建了Float个对象。当CXF在解析响应期间调用JAXB时,似乎会发生这种情况。

我正在评估CXF是否与可能发回数百万个浮点数的应用程序一起使用,因此这个对象创建非常不受欢迎。为了使用CXF,我需要找到一种方法来防止这种对象的创建。我已经浏览了文档和邮件列表,但还没有找到解决此问题的方法。

有没有人使用CXF遇到过类似的问题?如果是这样,你是如何解决这个问题的?

2 个答案:

答案 0 :(得分:2)

这绝对不是CXF可以做任何事情的。它更像是一个JAXB问题。我相信在内部,JAXB将所有“maxOccurs!= 1”情况作为java集合处理,而不是数组。如果需要,它只是转换为数组作为进程的最后一步。由于java集合不能保存基元,因此它将是存储的Float对象。

无论如何,这都需要与JAXB人员一起讨论。 : - (

答案 1 :(得分:0)

你说当阵列中的元素数量增加时,性能会受到影响。这对我来说听起来很合理 - 数据更多,性能更低。你在那里期待什么?只要它是线性降级,它就表现良好。

至于数百万个对象的创建,现代JVM可以做到这一点,而不会出汗。我怀疑CXF的设计师很清楚这一点。旧的JVM具有较差的GC算法,并且有数百万个对象确实会引起问题,但现在不再是这种情况了,特别是对于像你这样的非常短暂的对象。

因此,一方面,由于大量数据导致性能下降,并且创建了数百万个对象。但是,没有证据表明这两个观察结果是相关的。