2009-06-07 2 views
1

프로젝트 용으로 Apache CXF를 평가 중이므로 몇 가지 시도를 해보기 위해 작은 데모 애플리케이션을 작성했습니다. CXF 사용자 가이드에 따라, 필자의 애플리케이션을 신속하게 실행할 수있었습니다.Apache CXF가 프리미티브를 객체 유형으로 변환하지 못하게하는 방법은 무엇입니까?

테스트하고 싶은 한 가지는 CXF가 다양한 프리미티브를 반환하는 메서드를 얼마나 잘 처리 할 수 ​​있었는지입니다. 그래서 나는 방금 '임의의 숫자로 채워진 지정된 길이의 배열을 반환하는'float[] getRandFloats(int count) '메서드를 정의했습니다. java2wsdl에 의해 생성 된 WSDL을 보면, 메서드가 올바르게 반환 유형 float[]을 나타내는 것을 볼 수 있습니다. 클라이언트 측을 살펴보면, 나는 또한 궁극적으로 float[]을받는 것을 알 수 있습니다.

배열의 요소 수가 늘어남에 따라 클라이언트 성능이 저하되는 것으로 나타났습니다. 클라이언트 측에서 프로파일 러를 실행하고 리턴 된 배열의 모든 요소에 대해 Float 오브젝트가 작성되었음을 확인했습니다. CXF가 응답을 파싱하는 동안 JAXB를 호출 할 때 이것이 발생하는 것 같습니다.

수백만 개의 부동 소수점을 돌려 보낼 가능성이있는 응용 프로그램에서 사용하기 위해 CXF를 평가 중이므로이 개체 생성이 매우 바람직하지 않습니다. CXF를 사용하려면이 객체 생성을 방지하는 방법을 찾아야합니다. 문서와 메일 링리스트를 살펴 보았지만이 문제를 해결할 방법이 없었습니다.

누구나 CXF를 사용하여 비슷한 문제가 발생 했습니까? 그렇다면 어떻게이 문제를 해결 했습니까?

답변

2

이것은 분명히 CXF가 무엇이든 할 수있는 것은 아닙니다. JAXB 문제가 더 많습니다. 내부적으로, JAXB는 모든 "maxOccurs! = 1"사례를 배열이 아닌 Java 컬렉션으로 처리합니다. 필요한 경우 프로세스의 마지막 단계로 배열로 변환됩니다. Java 콜렉션은 프리미티브를 저장할 수 없으므로, Float 객체가 저장됩니다.

어쨌든 이것은 JAXB 사람들과 함께 취해야 할 것입니다. :-(

0

배열의 요소 수를 늘리면 cliernt 성능이 저하됩니다. 이것은 합리적인 것 같습니다 - 더 많은 데이터, 적은 성능. 그곳에서 당신은 무엇을 기대 했습니까? 선형 분해가되면 오히려 정상입니다.

수백만 개의 개체를 만드는 경우 현대 JVM은 땀을 흘리지 않고이 작업을 수행합니다. 나는 CXF의 설계자들이 이것을 잘 알고 있다고 생각한다. 오래된 JVM은 GC 알고리즘이 좋지 않았고, 수백만 개의 객체가 발생하여 실제로 문제가 발생했지만 더 이상 그렇지 않습니다. 특히 여기에있는 것처럼 매우 수명이 짧은 객체를 사용할 경우 더 그렇습니다.

한편으로는 많은 데이터와 수백만 개의 개체가 생성되어 성능 저하가 발생합니다. 그러나 두 가지 관찰 결과가 관련 있다는 증거는 없습니다.

+0

JVM이 상당히 개선되었지만 불필요한 개체 생성이 여전히 "무료"가 아니라는 데 동의합니다. 적어도이 문제를 내가 경험 한 성능 저하의 원인으로 간주하고 싶습니다. CXF가 완벽하게 받아 들여질 수있는 이런 종류의 사용을 위해 설계되지 않았을 가능성이 있습니다. 사용을 배제하기 전에 CXF에 대한 지식이 많은 사람이 주제에 무게를 달기를 바랍니다. –

+0

무료는 아니지만 JVM은 필요할 때 처음으로 새로운 객체를 생성 한 다음 필요에 따라 객체를 다시 생성합니다. 원하는 경우이 객체를 원인으로 간주하면 호출을 여러 번 실행하고 시간이 걸릴지 확인합니다 때마다 또는 상황이 개선되는 경우 동일합니다. – skaffman

관련 문제