Синтаксический анализ XML слишком медленный! - PullRequest
6 голосов
/ 01 июня 2011

Я написал Java-приложение для связи с веб-приложением с использованием XML.После развертывания я обнаружил, что синтаксический анализ XML, сгенерированного веб-приложением, занимает слишком много времени.

Например, для входа в систему требуется около 2 минут;информация для входа в систему включена в URL.Веб-приложение выполняет свою обработку и отвечает приложению Java, успешно ли выполнен вход в систему, с использованием возвращенного XML.

Я использовал стандартный синтаксический анализ Java DOM.

Есть ли способ оптимизировать этот процесс?так что деятельность может быть быстрее?

Ответы [ 4 ]

27 голосов
/ 25 июля 2012

Я столкнулся с той же проблемой и смог ускорить анализатор, отключив все проверки, которые DocumentBuilder будет выполнять по умолчанию:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

factory.setNamespaceAware(false);
factory.setValidating(false);
factory.setFeature("http://xml.org/sax/features/namespaces", false);
factory.setFeature("http://xml.org/sax/features/validation", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

// then take a builder via `factory.newDocumentBuilder()` and parse doc with that builder
2 голосов
/ 01 июня 2011

При использовании стандартного синтаксического анализатора XML короткое сообщение должно быть проанализировано примерно за одну миллисекунду.Используя пользовательский анализатор, вы можете сократить это до 20 микросекунд.В любое время дольше, чем это не в разборе XML

2 голосов
/ 01 июня 2011

Метод синтаксического анализа занимает все время, потому что он ожидает ввода от другого приложения.Вам нужно разделить два, чтобы вы могли видеть, что происходит.Считайте XML из другого приложения в ByteArrayOutputStream, затем, когда это будет сделано, скопируйте выходной поток во входной поток (для этого вы можете использовать commons-io) и передайте его парсеру.Затем посмотрите, что на самом деле занимает все время.

Одна вещь, которую вы могли бы оптимизировать, - это процесс входа в систему.Вы можете использовать сервер LDAP для аутентификации, LDAP оптимизирован для чтения, и вы можете получить к нему доступ с помощью JNDI.

0 голосов
/ 02 июня 2011

То, что сказал Натан, плюс я предлагаю сделать случайную паузу , пока это занимает так много времени.Я сталкивался с этим в прошлом и обнаружил, что не время занимает анализ, а создание и манипулирование структурой данных при их разборе.Вы можете увидеть что-то другое, но скорее всего это сюрприз.

...