2013-06-25 4 views
1

Я получаю ответ от веб-сервиса RESTful, который может возвращать String длиной до 300 КБ.Производительность JaxB на больших документах

Когда я пытаюсь распаковать гу с помощью JaxB2, это занимает до 12 секунд

Есть ли что я могу сделать?

public class Convertor{ 

    JAXBContext responseJaxbContext; 

    public Convertor(){ 
     requestJaxbContext = JAXBContext.newInstance(MyClassResponse.class); 
    } 


    public MyClassResponse convertXml(String str) { 
     MyClassResponse response = null; 
     try { 
      Unmarshaller jaxbUnMarshaller = bookingResponseJaxbContext.createUnmarshaller(); 
      StringReader reader = new StringReader(str); 
      response = (MyClassResponse) jaxbUnMarshaller.unmarshal(reader); 

     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 
     return response; 
    } 
} 

Обновление: я отключил проверку схемы с использованием

jaxbUnMarshaller.setSchema(null);

Теперь мой демаршалинга время составляет 5 -7 сек.

+0

Как вы измерили это время? 12s только для 300kb кажется много ... – Puce

+0

@Puce, я использую библиотеку SpringWatch Spring. –

+0

Как выглядит модель XML и Object? Существуют ли какие-либо свойства типа «Объект», которые могут приводить к созданию узлов DOM? Является ли документ действительным, иногда время может быть потрачено впустую на недопустимые значения, которые вызывают внутренние исключения. –

ответ

0

Убедитесь, что вы создаете экземпляр класса JAXBContext/your Convertor только один раз.

В моем опыте создание JAXBContext дорого.

Edit: Но это не объяснение 12s, я думаю ...

+0

Да, я проверил это. он создается только один раз. –

0

Для сравнения попробуйте синтаксического анализа XML-документ с SAX парсер, чтобы понять наш, сколько времени просто провели анализ документа XML ,

import java.io.StringReader; 
import javax.xml.parsers.*; 
import org.xml.sax.*; 
import org.xml.sax.helpers.DefaultHandler; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     String xml; // Your XML 

     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     spf.setNamespaceAware(true); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xmlReader = sp.getXMLReader(); 

     xmlReader.setContentHandler(new DefaultHandler()); 

     StringReader reader = new StringReader(xml); 
     InputSource inputSource = new InputSource(reader); 

     // Profile This 
     xmlReader.parse(inputSource); 
    } 

} 
Смежные вопросы