2013-09-04 7 views
2

Вот мой код конверсии. Это занимает много времени, когда мы имеем дело с большими данными ... Вызов метода почти в миллион раз ... Мы могли ясно видеть, что он поддерживает потоки на некоторое время.Как улучшить производительность JAXB?

Пожалуйста, предложите мне некоторые способы улучшить производительность!

public class GenericObjectXMLConverter<T> { 

    private T t = null; 
    private static JAXBContext jaxbContext =null; 
    public GenericObjectXMLConverter() { 

    } 
    public GenericObjectXMLConverter(T obj){ 
    t = obj; 
    } 

    protected final Logger log = Logger.getLogger(getClass()); 

    /** 
    * Converts the java Object and into a xml string message type. 
    * @param object the object to convert 
    * @return String the converted xml message as string 
    */ 
    public String objectToXMLMessage(T object) { 
    StringWriter stringWriter = new StringWriter(); 
    //JAXBContext jaxbContext=null; 
    try { 
     jaxbContext = JAXBContext.newInstance(object.getClass()); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
     jaxbMarshaller.marshal(object, stringWriter); 
    } catch (JAXBException e) { 
     log.warn("JAXBException occured while converting the java object into xml string :"+e.getMessage()); 
    } 
     /*if(log.isDebugEnabled()) 
     log.debug("xml string after conversion:"+stringWriter.toString());*/ 
     return stringWriter.toString(); 
    } 

    /** 
    * Converts a xml string message into a Java Object 
    * @param string the string message to convert 
    * @return Object the result as Java Object. If the message parameter is null then 
    * this method will simply return null. 
    */ 
    @SuppressWarnings("unchecked") 
    public T xmlToObject(String message) { 
    if(message.equals("") || message.equals(" ") || message.length()==0){ 
     return null; 
    }else{ 
     T object=null; 
     try { 
     jaxbContext = JAXBContext.newInstance(t.getClass()); 
     StringReader reader = new StringReader(message); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     object = (T)jaxbUnmarshaller.unmarshal(reader); 
     } catch (JAXBException e) { 
     log.warn("JAXBException occured while converting the xml string into a Java Object :"+e.getMessage()); 
     } 
     /* if(log.isDebugEnabled()){ 
      log.debug("Java object after conversion:"+object.toString()); 
     }*/ 
     return object; 
    } 
    } 

} 
+0

При каждом вызове метода вам не нужно создавать новый маршаллер/немаршаллер. Попробуйте «кэшировать» их и посмотрите, улучшается ли производительность. У меня такое ощущение, что маршаллер будет кэшировать метаданные класса, когда он сериализуется или десериализуется. – Augusto

+0

Но объект, который я передаю, отличается в каждый раз? Итак, как это работает? Можете ли вы уточнить, как кэширование может быть сделано .. –

+0

Это будет здорово, если вы можете предоставить мне некоторые образцы Заранее спасибо –

ответ

13

Производительность и JAXB среды выполнения Классы

  • Вы должны избегать создания такой же JAXBContext снова и снова. JAXBContext является потокобезопасным и его следует использовать повторно для повышения производительности.
  • Marshaller/Unmarshaller не являются потокобезопасными, но быстро создаются. Это не так много, чтобы повторно использовать их.
Смежные вопросы