Как повторно использовать экземпляры XPath с JDOM (безопасность потоков)? - PullRequest
0 голосов
/ 13 октября 2011

Здесь приведен пример кода:

x = XPath.newInstance("//collection/dvd[@id='B']");
Element e = (Element)x.selectSingleNode(doc);
listElement(e, "");

Вопрос во мне, как я могу сделать это быстро, если код часто вызывается. В документации ничего не сказано об этом ( XPath API doc ).

  • Мои оценщики xpath кешируются за кулисами? (Я так не думаю)
  • Являются ли оценщики xpath потокобезопасными с помощью JDOM? -> может кэшироваться в статической карте
  • Если это не потокобезопасно, возможно, они могут быть кэшированы на карте в локальном потоке
  • Это дорогие объекты? Требуется ли много времени для их производства? Они потребляют много памяти?
  • Оценщик xpath можно изменить. Какую реализацию вы рекомендуете? Они отличаются от точки зрения вопросов выше?

Если у вас есть опыт работы с JDOM и XPath, дайте мне знать ответы, пожалуйста.

Ответы [ 2 ]

2 голосов
/ 15 октября 2011

Просто отметим, что адаптер, который связывает JDOM с его реализацией по умолчанию, Jaxen, не потокобезопасен.Это легко сделать из быстрого изучения кода org.jdom.xpath.

Что касается более общего вопроса о безопасности потоков: если документация по API явно не претендует на то, что она безопасна для потоков,всегда должно быть предположение, что это не так (и это почти всегда так).И всегда разумно ставить под сомнение утверждение безопасности потока.

1 голос
/ 13 октября 2011

Может быть трудно найти документацию, которая отвечает на такие вопросы: например, многие люди удивляются, обнаружив, что DOM не является потокобезопасным.Я верю, что JDOM есть, но я не знаю о его движке XPath.Если вы используете Saxon в качестве движка XPath (он работает с JDOM), интерфейс s9api специально разработан для того, чтобы скомпилированное выражение можно было создавать в одном потоке и одновременно использовать в нескольких потоках.

...