У меня есть большая строка XSLT, которую я использую для преобразования XML в json. Я делаю это в веб-сервисе dropwizard, где очень желателен параллелизм. Когда я сохраняю эту строку XSLT в файле, это приводит к тому, что все потоки веб-службы обращаются к файлу в последовательном порядке из файловой системы (таким образом задерживая выполнение).
Если я попытаюсь сохранить этот XSLT как строку java, я получу исключение constant string too long. Как лучше всего хранить этот XSLT, чтобы мои потоки могли обращаться к нему параллельно?




Если исходный код XSLT действительно такой большой, вам, вероятно, следует сохранить его в файле, например в качестве ресурса пути к классам и загружать и анализировать его только один раз:
private static Templates largeTemplate;
Инициализировать с помощью (только один раз):
try (InputStream in = Test.class.getResourceAsStream("path/to/large.xslt")) {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
largeTemplate = transformerFactory.newTemplates(new StreamSource(in));
}
Затем для каждого потока:
Transformer transformer = largeTemplate.newTransformer();
// Use transformer here
@MichaelKay В том-то и дело. Единый общий экземпляр предварительно проанализированного файла XSLT, поэтому системе не нужно повторно анализировать его каждый раз, когда это необходимо. Поскольку вы тоже так говорите («сохраните скомпилированную таблицу стилей»), я не знаю, что должен был означать ваш комментарий.
Существует много дискуссий о том, когда уместно использовать статическое состояние по сравнению с одноэлементным шаблоном, например здесь: stackoverflow.com/questions/24214148/java-getinstance-vs-sta tic, и я не хочу, чтобы здесь обсуждались эти дискуссии, просто чтобы сказать, что я всегда буду использовать для этого одноэлементный шаблон, если он не тривиальное однократное приложение.
@MichaelKay Я не понимаю вашего первого комментария. Шаблон синглтона также хранит синглтон в статическом поле, и по самой своей природе в JVM будет только один экземпляр синглтона. Итак, если вы говорите, что вы не будете использовать static, и что это означает, что у вас может быть только один экземпляр в JVM, тогда DUH, да, в этом был смысл. Если вы хотели сказать, что я должен был использовать шаблон singleton, то вы должны были сказать это, но этот первый комментарий был бессмысленным, особенно его вторая половина.
Вы не хотите компилировать один и тот же большой XSLT-файл более одного раза, даже если несколько компиляций выполняются параллельно. Скомпилируйте его во время инициализации веб-службы или при первой ссылке и сохраните скомпилированную таблицу стилей (объект Templates, если вы используете JAXP), чтобы ее можно было повторно использовать для нескольких преобразований. Объект Templates является потокобезопасным, поэтому несколько преобразований с использованием этой таблицы стилей могут выполняться одновременно.
Я бы обычно не помещал объект Templates в статический; это означает, что у вас может быть только один экземпляр в JVM.