¿Aceleración de inicialización JAXBContext?


Hay alguna manera de acelerar la inicialización de javax.XML.unir.Jaxbcontextos con un gran (>1000) número de clases? En nuestra aplicación XML heavy el tiempo de inicio es de unos 10 minutos y consiste principalmente en el tiempo de inicialización de los JAXBContexts. :-(

Estamos usando la implementación JAXB de Sun en el JDK 1.5 y la org.jvnet.jaxb2.maven2.maven-jaxb2-plugin para la generación de código desde XSDs.

Aclaración: El problema no es que tengamos muchos casos de JAXBContext con los mismos contextpaths, pero el problema es que la inicialización de un solo JAXBContext toma decenas de segundos ya que tiene que cargar y procesar miles de clases. (Nuestros XSD son bastante grandes y complicados.) Todas las instancias de JAXBContext tienen diferentes trayectorias de contexto-no podemos reducir el número aún más.

Author: Hans-Peter Störr, 2009-04-27

4 answers

La implementación de referencia JAXB tiene una especie de propiedad de sistema indocumentada exactamente por esta razón:

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

O para versiones anteriores a la refactorización del paquete:

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

Esto instruye a JAXB a omitir el costoso proceso de pre-almacenamiento en caché de los diversos músculos de reflexión que necesita para hacer el trabajo. En su lugar, hará toda la reflexión cuando se use el contexto. Esto hace que el tiempo de ejecución sea más lento, pero la inicialización sea considerablemente más rápida, especialmente para grandes cantidades de clase.

Sin embargo, una parte del problema de velocidad es inevitable, y es el hecho de que JAXB tiene que cargar cada una de sus clases, y la carga de clases es lenta. Esto es evidente si crea un segundo contexto inmediatamente después del primero, con la misma configuración - verá que es mucho, mucho más rápido, ya que ya ha cargado las clases.

Además, usted dice que tiene múltiples instancias JAXBContext porque tiene múltiples contextpaths. ¿Te diste cuenta de que puedes poner ¿múltiples rutas de contexto en un solo contexto? Solo necesita pasarlos todos como una cadena delimitada por punto y coma cuando inicialice el contexto, por ejemplo,

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

Cargará los contextos a.b.c y x.y.z. Sin embargo, es probable que no haga ninguna diferencia en el rendimiento.

 33
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-17 21:24:40

En general, no debería tener que crear muchas instancias de JAXBContext, ya que son seguras para subprocesos después de haber sido configuradas. En la mayoría de los casos, un solo contexto está bien.

Entonces, ¿hay una razón específica por la que se crean muchas instancias? ¿Tal vez se asumió que no son seguros para el hilo? (lo cual es comprensible dado que esto no está claramente documentado -- pero es un patrón muy común, necesita sincronización durante la configuración, pero no durante el uso, siempre y cuando la configuración no sea cambiar).

Aparte de esto, si esto sigue siendo un problema, perfilar cuellos de botella y presentar un problema en jaxb.dev.java.net (señalar puntos calientes desde el perfil) ayudaría a mejorar las cosas. El equipo de JAXB es muy bueno, receptivo, y si puedes mostrar dónde están los problemas, generalmente ofrecen buenas soluciones.

 6
Author: StaxMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 18:13:47

JAXBContext es seguro para hilos, por lo que se recomienda envolverlo con un singleton. Escribí un sencillo singleton que contiene un mapa de clase - >contexto que parece hacer el trabajo. También es posible que desee crear un grupo de objetos [un]marshaller si su aplicación utiliza muchos subprocesos, ya que estos objetos no son seguros para subprocesos y puede ver algunas penalizaciones de inicialización con estos también.

 3
Author: chetan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-07 14:58:57

En nuestro caso actualizar las bibliotecas JAXB fue una buena idea. Incidencialmente, usar la VM del servidor en lugar de la VM del cliente incluso en el entorno de desarrollo fue una buena idea aquí, a pesar de que normalmente ralentiza el inicio del servidor: dado que la inicialización JAXB toma tanto tiempo, la mejor compilación de la VM del servidor ayuda.

 1
Author: Hans-Peter Störr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-23 09:48:21