EXSLT:没有更多的 DTM ID 可用
Posted
技术标签:
【中文标题】EXSLT:没有更多的 DTM ID 可用【英文标题】:EXSLT: No more DTM IDs are available 【发布时间】:2011-06-27 15:49:00 【问题描述】:我整天都在寻找这个问题的答案。 我正在为中等大小的 XML 文档(~1.5MB,~1000 个元素)创建样式表,这给我带来了很多麻烦。它是关于为不同的加工厂设备创建事件时间线图。 XML 通过 SAP MII QueryTempalte 生成,格式为 /Rowsets/Rowset/Row。所有这些数据都以 /Equipments/Equipment/Event 格式处理并存储在本地节点集中。 然后将此节点集处理为 html,然后在浏览器中呈现。 现在,我开始遇到一些麻烦。我可以轻松地提取过去 5 天的数据,从而从 MII 中提取约 900 行数据,并处理为我的节点格式,从而产生略低于 900 行的数据。但是第二次我点击从 MII 获取的 1017 行,样式表只会呈现大约一半,然后停止并且“没有更多的 DTM ID 可用”异常。 现在,MII 服务器只运行 JDK 1.5.x,而且我读过,这可能是个问题——唯一的问题是,我对此无能为力。 所以现在我在这里问:有没有办法优化我的代码?我为我的 XSL 和一个示例 XML 附加了一些链接。
XSL:http://pastie.org/1566517 示例 XML:http://pastie.org/1566522
现在,示例 XML 可能不会产生任何“有趣”的视觉结果,并且无法复制错误。但是如果有人能发现一个明显的优化,我很想知道:) 我一直在想,替换/移动 startOffset、endOffset 等的计算会很好,但我不知道怎么做。
希望有人可以帮助我! :)
【问题讨论】:
xml.apache.org/xalan-j/faq.html#faq-N10340 表示该问题仅出现在非常旧的 Xalan 版本中。即使您无法更改 JDK 版本,您也可以使用 Apache 提供的最新版本的 Xalan,而不是使用内置的 JDK。还有其他 XSLT 处理器在 Java 中实现并可用于 Java,例如 Saxon,因此您可以在示例数据和样式表上尝试它们并检查它们是否表现更好。 问题是,不可能弄清楚 Xalan 正在运行的版本——如果我什至在使用它。当我尝试将 xalan 命名空间添加到我的 xsl 时,处理器不会呈现它。此外,JDK 是“SAPsk”,这意味着我没有机会安装新东西或以任何方式修改它:( 由于 JDK 1.4 使用了 Xalan 的那个非常旧的版本,我已经多次遇到这个错误,所以您应该真正尝试找出您使用的是哪个版本。我不记得找到解决该错误的方法...“处理器不会渲染它”是什么意思? 我的意思是,如果我尝试处理过多的数据,XSL 只会在 HTML 呈现的中途停止。它只是输出 ' 嗨,Thor,您解决了这个问题吗? 【参考方案1】:知道这个问题很老,但我自己也遇到了同样的问题,对于那些也发现这个问题的人来说,似乎有一个 SAP Note 详细说明了一个可以解决这个问题的 JVM 补丁:
注释#1604623
https://websmp130.sap-ag.de/sap(bD1lbiZjPTAwMQ==)/bc/bsp/spn/sapnotes/index2.htm?numm=1604623
注释中的修复之一是:
改进了 XSLT 转换的资源消耗。我们修复了一个 XSLT 处理中的资源泄漏将导致错误 “DTMException:没有更多的 DTM ID 可用”对于复杂的 XSL,使用 (递归)模板。问题的原因是, 处理步骤的中间结果存储在 DTM 中, DTM 数量限制为 65536 个。
有了这个变化,有一个新的系统属性 “com.sap.jvm.xsltc.enableResourceOptimization”。如果这个属性是 设置为“true”,XSLT 编译器将发布中间结果并 因此将需要更少的资源。处理复杂的 XSL 应该 成为可能。请注意,默认情况下不会设置此系统属性。
【讨论】:
如果我没有这个后续行动
我们在不同的应用程序中也遇到过这个问题,错误的基础是相同的。正如上面提到的,根本问题是xalan, Apache project 处理xslt 文档的限制。该限制虽然很少触发,但由于用尽了最大数量的 65535(16 位)DTM id。在上述应用程序中,显然通过使用 SAP 中的资源分配效率特性可以避免这种情况,但这不适用于其他应用程序,例如我们正在使用的应用程序。
改变Xalan
总而言之,65K DTM id 限制已经存在了一段时间(约 2003 年),已修补,然后在 2.7 分支中丢失了补丁。当前最新版本的 2.7.2 存在此问题。在最基本的层面上,文档 ID 是一个 32 位整数。修复是一个源代码更改,增加了为 DTM 预留的位数。更深入的讨论可以查看here。建议的技巧是将节点位数更改为 12,从而将 DTM 的位数增加到 20,将总 DTM 增加到 1048576。步骤是
下载xalan source 通过修改设置IDENT_DTM_NODE_BITS
的行来解压和修改src/org/apache/xml/dtm/DTMManager.java。
构建xalan。您可能需要安装 ant 和 set the classpath appropriately。新的 jar 将位于构建目录中。
将之前的 xalan jar 替换为刚刚构建的那个。
【讨论】:
我也有这个“没有更多的 DTM ID 可用”错误。我获取了来源,将 IDENT_DTM_NODE_BITS 更改为 20,重新生成了 xalan.jar 但仍然是同样的错误。你能发给我一个对你有用的 xalan.jar 吗?谢谢! 我有一个关于链接的“彻底讨论”的问题,作者说«我无法想象在我的应用程序中需要超过 2^12 (4096) 个文档 ID...»,这实际上是什么文件ID的限制?它是每个JVM吗?这是否意味着 Xalan 最多可以工作。同时4096个文件?想象一个使用 Xalan 的 Web 应用程序,在每个 HTTP 请求中都会使用 Xalan,这意味着同时限制 4096 个并行 HTTP 请求,对吧?以上是关于EXSLT:没有更多的 DTM ID 可用的主要内容,如果未能解决你的问题,请参考以下文章