我有一個在Jetty下運行良好的spring引導java servlet,但在Tomcat下運行時性能問題,這是我們的目標部署環境。Spring引導servlet在Tomcat中顯示性能問題,但不顯示Jetty
- JAXB unmarshal是瓶頸,因爲ServiceLoader花費大量時間查找要使用哪個TransformerFactory實現。 (YourKit profiling showing the look up for the TransformerFactory implementation)
- 撒克遜是變換實現和罐子被包含到Tomcat/webapps /下的myapp/WEB-INF/lib和具有正確的META-INF/services文件
- 使用碼頭當這個問題是不存在servlet容器
- 我已確認下兩Jetty和Tomcat的運行我得到一個TransformerFactory正確執行從正確的罐子
明確添加映射到Tomcat JAVA_OPTS選項解決了這個問題:
-Djavax .xml.transform.TransformerFactory = net.sf.saxon.Transfo rmerFactoryImpl
編輯:在碼頭 我們的XML讀取/轉換時間約在Tomcat下5秒與20秒,它是直接由於類加載器搜索我們的TransformerFactory。
我能夠通過在servlet配置中顯式指定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和Web應用程序/ servlet的技巧。
對於4的一個問題:「運行可執行文件.jar或.war文件時」是指那些文件使用嵌入式碼頭而不是嵌入式tomcat? –
當我做了測試時,他們使用的是嵌入式Tomcat。碼頭在我的所有測試中一直都是外部的。 – dleb
我也讀過關於Jetty和Tomcat的類加載器的文檔。從這些,我不會指望有任何區別,因爲兩個容器必須遵守標準中的servlet容器設置的類加載器規則。 – dleb