У меня есть сервак java boot boot, который работает под Jetty, но имеет проблемы с производительностью при работе под Tomcat, который является нашей целевой средой развертывания.Сценарий весенней загрузки показывает проблемы с производительностью в Tomcat, но не Jetty
- JAMAHA unmarshal является узким местом, потому что ServiceLoader тратит много времени на поиск реализации TransformerFactory. (YourKit profiling showing the look up for the TransformerFactory implementation)
- Saxon является реализацией преобразования и баночка входят в коте/WebApps/MyApp/WEB-INF/Lib и имеет собственный META-INF/файл службы
- Этот вопрос не присутствуют при использовании Jetty в качестве сервлет контейнер
- Я подтверждал под управлением как Jetty и Tomcat я получить правильное выполнение для TransformerFactory от правильной баночки
Явного добавив отображение в опцию Tomcat JAVA_OPTS решает проблему:
-Djavax .xml.transform.TransformerFactory = net.sf.saxon.Transfo rmerFactoryImpl
Отредактировано: выборки/преобразования Наш XML время в Jetty составляет около 5 секунд против 20-х годов под Tomcat, и это напрямую связано с загрузчиком класса поисках нашего TransformerFactory.
Я могу исправить проблему, явно указав TransformerFactory в нашей конфигурации сервлета, но мой вопрос остается: Почему Tomcat требует этого явного setProperty и контейнера Jetty?
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
return application.sources(Application.class);
}
Извините, если это рудиментарный вопрос, я старый C++ собака обучения Java и веб-приложений/сервлетов фокусы.
Один вопрос до 4: с «при запуске исполняемого файла .jar или .war» вы подразумеваете, что эти файлы используют встроенный причал вместо встроенного tomcat? –
Когда я это сделал, они использовали встроенный Tomcat. Причал всегда был внешним во всех моих тестах. – dleb
Я также прочитал документы о загрузчике классов для Jetty и Tomcat. Из этого я не ожидал бы никакой разницы, потому что оба контейнера должны подчиняться правилам загрузчика классов для установки контейнеров сервлетов в стандарте. – dleb