Какие компоненты VTD xml являются потокобезопасными?

Использование ВТД 2.11

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

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

То же самое для автопилота. Я думаю, что могу установить свой XPATH один раз, а затем продолжать перепривязывать его при каждой новой навигации?


person user432024    schedule 23.05.2013    source источник
comment
То, что вы описали, вполне выполнимо, на самом деле это не проблема, связанная с многопоточностью...   -  person vtd-xml-author    schedule 26.05.2013
comment
Я знаю! Но у меня есть документ из 50-60 узлов, мне нужно прочитать 30 из этих значений. Значит, мне нужно 30 автопилотов? Значит ли это, что мне нужно объединить все 30 автопилотов. Было бы неплохо, если бы API позволял автопилоту запускаться один раз, а затем повторно использоваться столько раз, сколько мы хотим. Вместо того, чтобы создавать пул! Создание автопилотов и XPATH должно быть одноразовой конфигурацией. Это можно использовать в приложении, и нам не нужно создавать собственный пул для управления xpaths. Но ладно, я думаю, пока.   -  person user432024    schedule 26.05.2013
comment
Стоимость создания экземпляра VTDGen очень низкая, буквально ничего, создание нескольких экземпляров VTDGen вообще не требует ресурсов ЦП или памяти. С другой стороны, создание экземпляра AutoPilot с XPath — это совершенно другая проблема.   -  person vtd-xml-author    schedule 27.05.2013
comment
30 автопилотов? Вам нужно 30 выражений xpath?   -  person vtd-xml-author    schedule 27.05.2013
comment
Да понял. И да, у меня есть небольшой документ, но сложная структура, и мне нужно прочитать большинство значений. Я следую примеру привязки данных. Возможно, это не лучшее решение. В основном мне нужно преобразовать документ в другой формат. Моя идея состоит в том, чтобы привязать к POJO, а затем преобразовать этот Pojo в другой формат. Другой вариант - в то время как в цикле итерации сделать кучу операторов case и преобразовать таким образом. Или во время итерации поместить все в хэш-карту, а затем извлечь оттуда информацию и преобразовать. Что было бы хорошим способом преобразовать XML в другой формат с помощью VTD?   -  person user432024    schedule 27.05.2013
comment
Если навигация очень сложная, рассматривали ли вы возможность использования API VTDNav для ручной навигации по древовидной структуре? Это альтернатива XPath, но на самом деле ее проще реализовать.   -  person vtd-xml-author    schedule 29.05.2013
comment
Вы имеете в виду автопилот selectElement()? Итак, создайте 1 и только 1 AutoPilot, привяжите его к VTDNav и используйте кучу вызовов selectElement?   -  person user432024    schedule 29.05.2013
comment
Это в ваших примерах кодов?   -  person user432024    schedule 29.05.2013
comment
Нет, с помощью toElement() VTDNav   -  person vtd-xml-author    schedule 03.08.2013


Ответы (1)


Да, VTD-XML можно инициировать один раз и использовать многократно. Но поскольку стоимость инициализации VTDGen очень низкая, создание нескольких его копий требует небольших затрат...

AutoPilot также предназначен для повторного использования... он тесно связан с выражением XPath.

Однако во многих случаях имеет смысл назначать экземпляры AutoPilot каждому потоку... каждый из этих экземпляров ссылается на один и тот же xpath...

Например:

AutoPilot ap1 = new AutoPilot();
AutoPilot ap2 = new AutoPilot();

ap1.selectXpath("/a/b/c") // assign to thread 1
ap2.selectXPath("/a/b/c"); // assigned to thread2, 

Хотя ap1 и ap2 выбирают один и тот же xpath, они представляют собой два разных объекта xpath и могут оцениваться независимо двумя потоками... что лучше, чем пытаться использовать один автопилот между двумя потоками... что приводит к нежелательному конфликту потоков. ..

person vtd-xml-author    schedule 20.02.2016