Uso la operación JAXBContext.newInstance en mi aplicación web basada en JBoss. Esta operación, según tengo entendido, es muy pesada. Solo necesito dos instancias únicas de la clase Marshaller.¿Cómo puedo mejorar el rendimiento de la aplicación que utiliza la operación JAXBContext.newInstance?
Mi propuesta inicial es tener un bloque inicializador estático que inicializar estos dos casos sólo una vez en la carga de clases:
public class MyWebApp {
private static Marshaller requestMarshaller;
private static Marshaller responseMarshaller;
static {
try {
// one time instance creation
requestMarshaller = JAXBContext.newInstance(Request.class).createMarshaller();
responseMarshaller = JAXBContext.newInstance(Response.class).createMarshaller();
} catch (JAXBException e) {
e.printStackTrace();
}
}
private void doSomething() {
requestMarshaller.marshall(...);
responseMarshaller.marshall(...);
...
}
}
Si esta es una solución razonable, entonces yo supongo que he respondido a mi propia pregunta, pero me gustaría saber si esta es la forma correcta de hacer esto?
Solo un comentario: No debe volver a utilizar marshallers/unmarshallers, no son seguros para subprocesos. Simplemente créelos cada vez, es muy rápido – cocorossello
Creo que la solución sugerida aquí es inmediata, y muy útil, pero no creo que el ejemplo del código esté ilustrando el punto hecho en el texto de que no deberías estar llamando a JAXBContext .newInstance() cada vez que necesita un Marshaller. ¿No debería la línea en doSomething() ser 'requestMarshaller = jaxbContext.createMarshaller();'? – rscarter