JAXBContext를 작성하기 위해 필요한 시간 줄이기
웹 서비스 애플리케이션이 시작될 때마다 잠재적 JAXB 클래스를 위한 클래스 로더에 대한 검색이 수행됩니다. 사용자의 애플리케이션을 위한 검색 프로세스가 길면, 시스템이 사용자의 애플리케이션용 JAXBContext 작성에 소비하는 시간을 줄이는 방법이 있습니다.
- JAXB 클래스를 포함할 수 있는 패키지의 목록 작성.
목록은 WSDL과 어노테이션의 컨텐츠를 기반으로 작성됩니다. 패키지의 목록을 작성하는데 필요 한 시간을 줄이는 옵션은 없습니다. 그러나, 일부 코너 케이스와 고유 사용 시나리오를 통해 JAXB 클래스를 포함하지 않는 패키지가 패키지 목록에 포함되게 할 수도 있다는 점을 아는 것이 중요합니다. 임의의 JAXB 클래스를 포함하지 않는 패키지가 포함된 것을 나타내는 추적 메시지의 예는 다음과 같습니다.
Here is an example trace that indicates this situation12/2/11 6:24:40:548 PST] 0000003e JAXBUtils 1 org.apache.axis2.jaxws.message.databinding.JAXBUtils createJAXBContextValue Package com.company.queryall.v1 does not have any JAXB classes. It is removed from the JAXB context path.
이 메시지가 발생할 때마다, JAXB 클래스가 없다는 것을 나타내기 위해 비어있는 jaxb.index 파일을 패키지에 포함시켜야 합니다. 이 조치가 취해지지 않으면, JAXB 클래스 검색에 시간이 소요됩니다.
- 시작될 JAXBContext.newInstance()의 서명 판별. JAXBContext.newInstance()가 패키지 목록 또는 JAXB 클래스의 목록으로 시작될 수 있기 때문에, 목적을 기반으로 사용 방법을 결정해야 합니다.
- 실제로 JAXBContext 오브젝트를 작성하는 JAXBContext.newInstance() 시작.
다음 조치를 완료하면 JAXBContext를 작성하는데 필요한 시간을 줄일 수 있습니다.
- JAXB 검색 결과의 지속적 캐시를 사용합니다. 각 패키지에 대한 검색 결과의 지속적 캐시를
사용하려면,
com.ibm.ws.websvcs.getJAXBContext.cacheClassList.persist JVM(Java™ virtual machine) 사용자 정의 특성을
true로 설정하십시오.
JAXBContext용 패키지에 ObjectFactory 또는 jaxb.index 파일이 포함되지 않은 경우, 각 패키지의 잠재적 JAXB 클래스용 클래스 로더의 검색이 수행됩니다. 큰 클래스 로더가 포함될 때 이 검색에 많은 시간이 소요될 수 있습니다. 검색된 각 패키지의 검색 결과를 영구적으로 캐시하기 위해 com.ibm.ws.websvcs.getJAXBContext.cacheClassList.persist JVM 사용자 정의 특성을 사용할 수 있습니다. 차후에 JAXBContext 요청은 해당 패키지에 대한 새 검색을 수행하는 대신에 클래스의 캐시 목록을 사용합니다.
애플리케이션이 업데이트되거나 설치 제거될 때 캐시가 제거됩니다. 이 방법이 패키지의 목록을 제공하는 것 만큼 성능을 개선하지 않지만, 애플리케이션에 대한 변경도 요구하지 않습니다.
jaxb.index 파일을 사용하더라도 이 조치는 첫 번째 단계로서 권장됩니다.
- ObjectFactory 클래스를 포함하지 않는 모든 패키지에 jaxb.index
파일을 제공하십시오. 이 조치로 완전히 시스템이 JAXB 클래스에 대한 검색를 피할
수 있습니다. 이 방법에서는 jaxb.index 파일의 추가를
위해 애플리케이션 수정을 고려하도록 요구합니다.
모든 패키지가 또한 ObjectFactory 클래스 또는 패키지를 위한 JAXB 클래스를 지정하는 jaxb.index 파일을 포함하면, JAXB 클래스를 포함하는 패키지의 목록이 사용될 수 있습니다. ObjectFactory 클래스 또는 jaxb.index 파일에서 JAXB 클래스의 목록을 제공할 때, JAXB 클래스에 대한 어떤 검색도 요구되지 않습니다.
더 많은 성능 개선을 제공하는 패키지 목록을 사용하면 수동으로 jaxb.index 파일을 작성하고 애플리케이션을 변경해야 할 수 있습니다. 이 방법을 사용하기로 결정하면, ObjectFactory를 포함하지 않습니다 메시지를 위한 디버그 추적 로그를 검토하여 업데이트되어야 하는 패키지 수를 판별할 수 있습니다.
최적의 성능을 원하고 애플리케이션을 변경할 수 있는 경우, jaxb.index 파일을 사용할 수 있습니다. ObjectFactory 클래스는 보통 하향식 도구(wsimport)로만 작성됩니다. 따라서 상향식 도구 wsgen으로 개발된 패키지는 ObjectFactory 클래스를 포함하지 않을 수 있습니다. jaxb.index 파일은 패키지 내에 JAXB 클래스를 식별하고 컨텍스트 작성을 위해 소요되는 시간을 감소시키는데 사용됩니다. JAXBContext.newInstance() 메소드는 ObjectFactory 클래스를 승인하는 방식과 동일한 방식으로 jaxb.index 파일을 승인합니다.
jaxb.index 파일을 사용하면 패키지가 ObjectFactory 클래스를 포함하지 않음을 나타내는 추적 파일에서 모든 인스턴스를 평가하고 적절한 jaxb.index 파일을 작성해야 합니다. jaxb.index 파일을 필요로 하는 패키지를 표시하는 ObjectFactory를 포함하지 않습니다 메시지를 위한 추적을 검색한 후, 다음을 수행해야 합니다.- JAXB 클래스의 목록으로 jaxb.index 파일을 작성하십시오. 패키지가 임의의 JAXB 클래스를 포함하지 않으면, 비어있는 jaxb.index 파일은 패키지에 배치해야 합니다.
- 추적 조작을 재실행하고 ObjectFactory를 포함하지 않습 니다 메시지도 여전히 추적에 나타나는지 확인하십시오.
필수 JAXB 클래스가 누락되고 jaxb.index 파일에 포함되지 않으면, 클래스가 JAXBContext에 알려지지 않아 클래스가 jaxb.index 파일에 추가되어야 함을 표시하는 오류가 발생합니다.
JAXBContext에서 사용되는 모든 패키지는 ObjectFactory 클래스 또는 JAXB 클래스 검색을 방지하는 jaxb.index 파일이 있어야 합니다. 추적 파일이 조사되고 누락된 ObjectFactory 클래스나 jaxb.index 파일의 각 인스턴스를 분석해야 함을 의미합니다. JAXBContext를 위한 임의의 패키지도 ObjectFactory 클래스 또는 jaxb.index 파일을 포함하지 못하는 것으로 식별되면, JAXB 클래스 검색 수행에 시간이 소요됩니다. jaxb.index 파일의 형식은 http://docs.oracle.com/javaee/5/api/javax/xml/bind/JAXBContext.html 에서 Oracle Javadoc for JAXBContext.newInstance()에 문서화되어 있습니다.
전이 사용자용: 버전 7.0에서, wsgen이 생성된 클래스를 작성하는데 사용되면, 유지되지 않습니다. 그러나, JAX-WS 스펙 2.2에서는 생성된 클래스를 유지해야 합니다. 그러므로, wsgen은 생성 클래스를 packagename/jaxws 디렉토리에 배치합니다. 따라서, 지금 검색하기 위한 패키지 목록은 packagename/jaxws를 포함하며, 이는 EAR 파일에 없습니다. 이 상황이 발생하면, 다음 메시지와 유사한 오류 메시지를 받습니다.
이 오류를 해결하기 위해 다음을 수행할 수 있습니다.6/21/12 17:07:36:477 CDT] 0000001a JAXBContextTr 1 org.apache.axis2.jaxws.message.databinding.JAXBUtils createJAXBContextValue JAXBContextCreate: Package somepackage.jaxws does not contain an ObjectFactory or package-info class. Searching for JAXB classes
- 다른 두 개의 EAR 파일을 작성하십시오. 하나는 버전 7.0에서 사용하기 위한 somepackage.jaxws jaxb.index 파일이 없는 파일과 다른 하나는 현재 버전의 제품에서 사용하기 위한 somepackage.jaxws jaxb.index 파일을 포함한 파일을 작성하십시오.
- 제품의 두 버전에 대해 단일 EAR 파일을 사용하려면 EAR 파일에 생성된 클래스와 jaxb.index 파일을 추가하십시오. 이 선택사항을 사용하면, 생성된 클래스로 WSDL도 포함해야 합니다.
- jaxb.index 파일 대신 지속적인 캐시를 사용하십시오. 이 선택사항 JAX-RS로 패키지당 JAXB 클래스를 한 번 검색하지만 결과를 유지하므로 애플리케이션이 업데이트되지 않는 한 다시 검색하지 않아도 됩니다.
- JAXBContext.newInstance() 자체가 완료하려면 긴 시간이 소요되는 경우, 가비지 콜렉션 중 누락되지 않는 JAXBContext 오브젝트의 하드 참조 캐시를 작성하기 위해 jaxws.JAXBContext.permStoreCostThresholdMsec JVM 사용자 정의 특성을 사용할 수 있습니다.
실제 JAXBContext 인스턴스 작성을 변경하거나 개선하기 위한 선택사항은 없습니다. 컨텍스트를 초기화하기 위해 소요된 시간은 JAXB 클래스의 수, 패키지의 수 및 클래스 경로의 크기와 같은 많은 요인에 의해 영향을 받습니다. 작성된 JAXBContext는 메모리의 소프트 참조 캐시에 있습니다. 결과적으로, 사용 가능한 메모리가 낮으면 가비지 콜렉션은 JAXBContext를 제거할 수 있습니다. 다음 요청에서는 버려진 JAXBContext를 요청하므로 JAXBContext를 다시 작성해야 합니다. 이 재작성 프로세스가 대부분의 JAXBContext에 대해 중요하지 않지만, newInstance() 단계 자체가 상당한 시간을 소요하는 예외가 있습니다.
애플리케이션용 JAXBContext에서 newInstance() 작성 시간이 많이 소요된다면, 다음 JVM 사용자 정의 특성을 사용하여 JVM이나 애플리케이션이 다시 시작될 때까지 지속하는 캐시에 JAXBContext를 배치할 것을 고려하십시오.
- jaxws.JAXBContext.permStoreCostThresholdMsec
- 이 특성을 0이 아닌 값(밀리초)으로 설정하십시오. 구성하는 데 지정된 시간보다 더 많은 시간을 요구하는 컨텍스트는 캐시됩니다. 권장값은 5000 이상입니다. 기본값은 0이며, 이 특성이 0으로 설정되면 캐시는 사용되지 않습니다.
- jaxws.JAXBContext.permStoreMaxSize
- 이 특성을 캐시에서 유지보수할 최대 개수의 항목으로 설정하십시오. 기본값은 32입니다. 캐시가 가득 차게 되면, 작성하는데 최소 시간을 필요로 하는 JAXBContext가 캐시에서 제거되어 더 긴 작성 시간의 JAXBContext에 양보합니다.
- jaxws.JAXBContext.permStoreStaleThresholdHours
- 이 특성을 캐시에 항목이 남아 있기 원하는 시간으로 설정하십시오. 지정된 시간 후 액세스되지 않는 캐시의 항목은 최신 항목이 캐시에 추가되기 전에 제거됩니다. 기본값은 24시간입니다.