1

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

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

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

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

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

4

2 回答 2

2

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

无论如何,这必须由 JAXB 人员处理。:-(

于 2009-06-08T19:15:02.067 回答
0

您说随着数组中元素数量的增加,客户端性能会受到影响。这对我来说听起来很合理——更多的数据,更少的性能。你在那儿期待什么?只要它是线性退化,它的行为就可以了。

至于创建数百万个对象,现代 JVM 会毫不费力地做到这一点。我怀疑 CXF 的设计者很清楚这一点。旧 JVM 的 GC 算法很差,并且有数百万个对象在乱跑确实会导致问题,但现在情况已不再如此,尤其是对于像这里这样的非常短暂的对象。

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

于 2009-06-07T19:34:06.800 回答