2009-04-27 4 views
24

클래스 수가 크고 (> 1000) 많은 javax.xml.bind.JAXBContexts의 초기화 속도를 높일 수 있습니까? XML 과도한 응용 프로그램에서는 시작 시간이 약 10 분이며 주로 JAXBContext의 초기화 시간으로 구성됩니다. :-(JAXBContext 초기화 속도 향상?

우리는 JDK 1.5 및 XSD를의 코드 생성을위한 org.jvnet.jaxb2.maven2.maven-JAXB2 - 플러그인에서 썬의 JAXB 구현을 사용하는

대한 설명 :. 문제는 아니다 동일한 컨텍스트 경로를 가진 JAXBContext의 인스턴스가 많지만 문제는 수천 개의 클래스를로드하고 처리해야하기 때문에 하나의 JAXBContext를 초기화하는 데 수십 초가 걸린다는 것입니다. (우리 XSD는 상당히 크고 복잡합니다.) 모든 JAXBContext 인스턴스가 다른 컨텍스트 경로를 가짐 - 더 이상 숫자를 줄일 수 없음

답변

32

JAXB 프로 참조 구현은 정확히 이런 이유로 일종의 -의 - 문서화되지 않은 시스템 속성이 있습니다 작업을 수행하는 데 필요한 다양한 반사 근육을 사전 캐싱하는 비싼 프로세스를 건너 뜁니다. 대신 컨텍스트가 사용될 때 모든 리플렉션을 수행합니다. 이로 인해 런타임이 느려지지만 특히 많은 수의 클래스에서 초기화가 상당히 빠릅니다.

그러나 속도 문제의 한 부분은 피할 수 없으며 JAXB가 클래스 하나 하나를로드해야한다는 것이므로 클래스로드가 느립니다. 동일한 구성으로 첫 번째 문맥 바로 다음에 두 번째 문맥을 생성하면 이것은 분명합니다. 클래스를 이미로드 한 상태에서 훨씬 빠르게 볼 수 있습니다.

또한 여러 개의 컨텍스트 경로가 있기 때문에 여러 개의 JAXBCOntext 인스턴스가 있다고 가정합니다.여러 컨텍스트 경로를 단일 컨텍스트에 넣을 수 있다는 것을 알고 계셨습니까? 컨텍스트를 초기화 할 때 세미콜론으로 구분 된 문자열로 모두 전달하면됩니다.

JaxbContext.newInstance("a.b.c:x.y.z"); 

는 컨텍스트를로드 a.b.cx.y.z 것입니다. 하지만 성능에는 아무런 차이가 없을 것입니다.

+5

명확한 설명을 위해 콜론을 사용하여 세미콜론이 아닌 패키지 이름을 구분해야합니다. 적어도 Sun JAXB RI와 함께하십시오. – ThaDon

6

일반적으로 JAXBContext의 인스턴스를 여러 개 만들 필요는 없습니다. 구성되었습니다. 대부분의 경우 단일 컨텍스트만으로 충분합니다.

많은 인스턴스가 생성되는 특별한 이유가 있습니까? 아마도 스레드로부터 안전하지 않다고 가정했을 것입니다. (이는 명확하게 문서화되지 않았기 때문에 이해할 만하지만 매우 일반적인 패턴이므로 구성 중에는 동기화가 필요하지만 구성이 변경되지 않는 한 사용하지 않는 것이 좋습니다).

이 외에도 여전히 문제가 있다면 & 프로파일을 jaxb.dev.java.net (프로필의 핫 스폿 지정)에서 문제를 제기하면 상황이 개선되는 데 도움이됩니다. JAXB 팀은 매우 훌륭하고 반응이 좋으며 문제가있는 곳을 표시 할 수 있다면 대개 좋은 해결책을 제시합니다.

+0

질문의 설명을 참조하십시오. 각 인스턴스마다 다른 컨텍스트 경로가 있으므로 인스턴스 수를 줄일 수 없습니다. 문제는 이러한 단일 인스턴스의 초기화에 수십 초가 걸리는 것입니다. –

+0

확인. 여전히 하나의 슈퍼 컨텍스트를 만들 수 있도록 종속 클래스를 정적으로 참조하는 더미 "루트 클래스"를 만드는 것이 가능한지 궁금합니다. 그러나 그것을하지 않는 다른 이유가있을 수 있습니다. 시간이 있다면 정말 간단한 프로파일 링을 수행하고 시간이 소비되는 곳을 확인하는 것이 좋습니다. 컨텍스트 중 하나가 생성 속도가 느리고 일반 JVM 및 -Xhprof로 실행되는 한 스택 추적에 몇 가지 원인이 표시되어야합니다. 해결 방법을 암시하거나 개선을 위해 JAXB 팀을 지적 할 수 있습니다. – StaxMan

+0

@hstoerr 초기화 프로세스가 10 초 정도 걸리기 때문에 응용 프로그램 시작시 초기화 프로세스를 병렬로 수행하는 것이 가장 실용적이지 않습니까? – Nielsvh

3

JAXBContext는 실제로 스레드로부터 안전하므로 싱글 톤으로 배치하는 것이 좋습니다. 작업을 수행하는 클래스 -> 컨텍스트 맵을 포함하는 간단한 싱글 톤을 작성했습니다. 또한 응용 프로그램이 많은 스레드를 사용하는 경우 [un] 마샬 러 객체 풀을 만들 수 있습니다. 이러한 객체는 스레드로부터 안전하지 않으므로 이러한 객체와 함께 초기화 페널티가 나타날 수 있습니다.

+0

제 설명을 참조하십시오 - 도움이되지 않습니다. –

+0

StaxMan이 제안한 것처럼 단일 컨텍스트를 초기화하는 데 오랜 시간이 걸리면 JAXB 코드 자체를 프로파일 링하지 못할 수도 있습니다. 초기화 시간이 다소 무시 될 수있는 장기 실행 응용 프로그램이 아니라고 가정 할 때 다른 ORM을 살펴볼 수도 있습니다. – chetan

1

우리의 경우 JAXB 라이브러리를 업데이트하는 것이 좋습니다. 덧붙여서 개발 환경에서도 클라이언트 VM 대신 서버 VM을 사용하는 것이 좋습니다. 일반적으로 서버 시작 속도가 느려지더라도 JAXB 초기화에는 서버 VM을보다 효과적으로 컴파일 할 수 있으므로 시간이 많이 걸립니다.

-Dcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot=true 

또는 이전 패키지 리팩토링에 이전 버전에 대한

:

-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true 

이것은 JAXB에 지시