我在Tomcat项目中使用Saxon。撒克逊人第一次使用,我经历了长时间的延迟,10秒。我可能没有最好的Saxon JAR或Saxon许可证。
我已将Saxon许可证放在Tomcat lib目录中。 (使用CATALINA和Tomcat JAR)。我已将Saxon JAR放入我的网络应用WEB-INF/lib
目录。
我使用的是Apache Tomcat 7.0.65,Java 1.7.0_80,Saxon EE 9.7.0.5,Windows 10.
WEB-INF/lib
目录有139个JAR。2017年6月1日新信息
提供堆栈跟踪会有帮助吗?慢速区域的部分列表如下:
14,772 ms net.sf.saxon.jaxp.SaxonTransformerFactory.newTemplates(javax.xml.transform.Source)
14,772 ms net.sf.saxon.s9api.XsltCompiler.compile(Source)
...
11,429 ms net.sf.saxon.expr.instruct.NumberInstruction.simplify()
11,429 ms net.sf.saxon.expr.instruct.NumberInstruction.preallocatNumberer(Configuration)
11,429 ms makeNumberer()
11,429 ms getNumberer()
11,336 ms JavaPlatformPE.hasICUNumberer()
...
11,305 ms com.ibm.icu.text.RuleBasedCollater.<clinit>
...
11,180 ms Class.getResourceAsStre
6月2日的更多信息
Class.forName("com.ibm.icu.text.RuleBasedNumberFormat");
花很少的时间
在调用newTemplates()之前使用Class.forName没有帮助。
com.saxonica.config.ICULibrary.hasNumberer()
返回true
icu4j-49.1.jar位于类路径
中 new com.saxonica.config.ICULibrary();
需要10秒
答案 0 :(得分:0)
您是否使用JAXP TransformerFactory.newInstance()
方法加载Saxon?这涉及到类路径的搜索,这可能非常耗时,类路径上有139个JAR。考虑直接指定Saxon TransformerFactory进行实例化,例如
TransformerFactory f = new com.saxonica.config.EnterpriseTransformerFactory();
答案 1 :(得分:0)
根据提供的新信息,编译xsl:number
指令时会出现延迟,特别是在加载Saxon-EE用于本地化支持的ICU库时。 Saxon正在对类com.ibm.icu.text.RuleBasedCollator
和com.ibm.icu.text.RuleBasedNumberFormat
进行动态加载,如果在类路径上,则应该在saxon9-icu.jar中找到动态加载,如果你已经在不同版本的ICU4j库中找到它有一个不同的版本。如果找不到这个课程,撒克逊会继续没有它,但是本地化支持会减少。
因此,由于某种原因,在加载此类时对Class.getResourceAsStream()的调用似乎长期缓慢。我不知道为什么,但希望这会缩小调查范围。要检查的是(a)负载是否实际上是成功的(调用静态方法com.saxonica.config.ICULibrary.hasNumberer()
来查找); (b)ICU图书馆是否在撒克逊分布或其他地方发布的类别路径上;然后(c)做一些装载程序跟踪,或许只是做
Class.forName("com.ibm.icu.text.RuleBasedNumberFormat")
根本不涉及撒克逊人。