JAXB creating context and marshallers cost

后端 未结 8 2071
情深已故
情深已故 2020-11-28 02:00

The question is a bit theoretical, what is the cost of creating JAXB context, marshaller and unmarshaller?

I\'ve found that my code could benefit from keeping the sa

相关标签:
8条回答
  • 2020-11-28 02:48

    I solved this problem using:

    • shared thread safe JAXBContext and thread local un/marschallers
    • (so theoretically, there will be as many un/marshaller instances as there are threads which accessed them)
    • with synchronization only on un/marshaller's initialization.
    public class MyClassConstructor {
        private final ThreadLocal<Unmarshaller> unmarshallerThreadLocal = new ThreadLocal<Unmarshaller>() {
            protected synchronized Unmarshaller initialValue() {
                try {
                    return jaxbContext.createUnmarshaller();
                } catch (JAXBException e) {
                    throw new IllegalStateException("Unable to create unmarshaller");
                }
            }
        };
        private final ThreadLocal<Marshaller> marshallerThreadLocal = new ThreadLocal<Marshaller>() {
            protected synchronized Marshaller initialValue() {
                try {
                    return jaxbContext.createMarshaller();
                } catch (JAXBException e) {
                    throw new IllegalStateException("Unable to create marshaller");
                }
            }
        };
    
        private final JAXBContext jaxbContext;
    
        private MyClassConstructor(){
            try {
                jaxbContext = JAXBContext.newInstance(Entity.class);
            } catch (JAXBException e) {
                throw new IllegalStateException("Unable to initialize");
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 02:53

    Even better!! Based on the good solution from the post above, create the context just-once in the constructor, and save it instead of the class.

    Replace the line:

      private Class clazz;
    

    with this one:

      private JAXBContext jc;
    

    And the main constructor with this one:

      private Jaxb(Class clazz)
      {
         this.jc = JAXBContext.newInstance(clazz);
      }
    

    so in the getMarshaller/getUnmarshaller you can remove this line:

      JAXBContext jc = JAXBContext.newInstance(clazz);
    

    This improvement makes, in my case, that processing times drops from 60~70ms to just 5~10ms

    0 讨论(0)
提交回复
热议问题