Saxon在Apache Tomcat中加载缓慢

时间:2017-05-22 16:41:40

标签: tomcat saxon

我在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.

  1. 我怎么知道撒克逊人第一次加载需要多长时间?模糊的问题。
  2. 该项目是一个Maven项目,因此WEB-INF/lib目录有139个JAR。
  3. Saxon JAR和许可证应该放在哪里?
  4. 2017年6月1日新信息

    提供堆栈跟踪会有帮助吗?慢速区域的部分列表如下:

    14,772 ms net.sf.saxon.jaxp.SaxonTransformerFactory.newTemplates(javax‌​.xml.transform.Sourc‌​e)
    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.preallocatNumbe‌​rer(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秒

2 个答案:

答案 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.RuleBasedCollatorcom.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")

根本不涉及撒克逊人。