2013-06-17 5 views
0

Я получаю большой ответ SOAP с примерно 10000 + строками данных и извлекаю соответствующие данные из CDATA и вставляя их в базу данных.Ошибка из памяти при анализе ответа SOAP

Код выглядит так:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setCoalescing(true); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
InputStream is = new ByteArrayInputStream(resp.getBytes()); 
Document doc = db.parse(is); 
XPathFactory xPathfactory = XPathFactory.newInstance(); 
XPath xpath = xPathfactory.newXPath(); 
XPathExpression expr = xpath.compile(fetchResult); 
String result = (String) expr.evaluate(doc, XPathConstants.STRING); 

соответственно содержит ответ SOAP fetchResult является

String fetchResult = "//result/text()"; 

Я получаю OutOfMemory ошибку в последней строке. Я попытался увеличить размер кучи до 1,2 ГБ, но это тоже не сработало.

Может ли кто-нибудь из вас, пожалуйста, помочь мне?

ответ

0

Обработать документ как поток, вместо того, чтобы потреблять весь отклик как Document. Код, который у вас есть, в настоящее время создает структуру, представляющую документ в памяти, а затем пытается оценить выражение XPath на нем.

Более эффективный подход к памяти должен был бы использовать парсер SAX (см. here). Используя синтаксический анализатор SAX, вы будете передавать поток через документ по мере необходимости, сохраняя только небольшую часть документа в памяти в любой момент времени.

+0

спасибо Джефф за решение. Однако я не могу придумать код. Не могли бы вы помочь мне? – user1356042

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