我正在为一个项目评估Apache CXF,所以我写了一个小的演示应用程序来尝试一些事情。按照CXF用户指南,我能够快速启动并运行我的应用程序。
我想测试的一件事是CXF能够处理返回大量基元的方法。所以我定义了一个方法'float[] getRandFloats(int count)
',它只返回一个用随机数填充的指定长度的数组。查看由java2wsdl
生成的WSDL,我看到该方法正确地指示了float[]
的返回类型。检查客户端,我也看到我(最终)收到float[]
。
我注意到随着我增加数组中的元素数量,客户端性能会受到影响。我在客户端运行了一个分析器,看到为返回的数组中的每个元素创建了Float
个对象。当CXF在解析响应期间调用JAXB时,似乎会发生这种情况。
我正在评估CXF是否与可能发回数百万个浮点数的应用程序一起使用,因此这个对象创建非常不受欢迎。为了使用CXF,我需要找到一种方法来防止这种对象的创建。我已经浏览了文档和邮件列表,但还没有找到解决此问题的方法。
有没有人使用CXF遇到过类似的问题?如果是这样,你是如何解决这个问题的?
答案 0 :(得分:2)
这绝对不是CXF可以做任何事情的。它更像是一个JAXB问题。我相信在内部,JAXB将所有“maxOccurs!= 1”情况作为java集合处理,而不是数组。如果需要,它只是转换为数组作为进程的最后一步。由于java集合不能保存基元,因此它将是存储的Float对象。
无论如何,这都需要与JAXB人员一起讨论。 : - (
答案 1 :(得分:0)
你说当阵列中的元素数量增加时,性能会受到影响。这对我来说听起来很合理 - 数据更多,性能更低。你在那里期待什么?只要它是线性降级,它就表现良好。
至于数百万个对象的创建,现代JVM可以做到这一点,而不会出汗。我怀疑CXF的设计师很清楚这一点。旧的JVM具有较差的GC算法,并且有数百万个对象确实会引起问题,但现在不再是这种情况了,特别是对于像你这样的非常短暂的对象。
因此,一方面,由于大量数据导致性能下降,并且创建了数百万个对象。但是,没有证据表明这两个观察结果是相关的。