撒克逊人在阿帕奇雄猫中加载缓慢



我在Tomcat项目中使用Saxon。第一次使用撒克逊时,我经历了很长的延迟,10 秒。我可能没有撒克逊 JAR 或撒克逊许可证在最好的地方。

我已经把撒克逊许可证放在Tomcat lib dir.(带有CATALINA和Tomcat JARs)。我已将撒克逊 JAR 放在我的 Web 应用程序的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. 撒克逊JAR和许可证应该放在哪里?

新信息 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()返回真

值ICU4J-49.1.jar 位于类路径中

new com.saxonica.config.ICULibrary();需要 10 秒

您是否使用 JAXPTransformerFactory.newInstance()方法加载 Saxon?这涉及对类路径的搜索,对于类路径上的 139 个 JAR,这可能非常耗时。考虑通过直接指定撒克逊变压器工厂来实例化,例如

TransformerFactory f = new com.saxonica.config.EnterpriseTransformerFactory();

根据提供的新信息,在编译xsl:number指令时,特别是在加载 Saxon-EE 用于本地化支持的 ICU 库时,会发生延迟。Saxon 正在对类com.ibm.icu.text.RuleBasedCollatorcom.ibm.icu.text.RuleBasedNumberFormat进行动态加载,这应该在 saxon9-icu 中找到.jar如果它在类路径上,或者如果你有不同的版本,则在 ICU4j 库的不同版本中。如果找不到该类,Saxon 将继续没有它,但本地化支持减少。

因此,由于某种原因,加载此类时对 Class.getResourceAsStream() 的调用似乎长期缓慢。我不知道为什么,但希望这将缩小调查范围。要检查的事情是(a)加载是否真的成功(调用静态方法com.saxonica.config.ICULibrary.hasNumberer()找出答案);(b) ICU 库是否在类路径上,无论是在撒克逊发行版中发布还是在其他发行版中发布;然后(c)做一些加载程序跟踪,也许只是做

Class.forName("com.ibm.icu.text.RuleBasedNumberFormat")

完全不涉及撒克逊人。

最新更新