我们继承了一个应用程序(基于Java,在WebLogic 10.3.5上运行),它广泛使用JSTL XML标记,尤其是XPath选择器。很快我们遇到了一些性能问题,因为这些标签的实现以及DTMManager类首先被解析然后由DTMManager.newInstance方法实例化。
DTMManager类名称查找问题以前是documented,并通过设置com.sun.org.apache.xml.dtm.DTMManager
系统属性来解决。
但是,一旦找到类名,com.sun.org.apache.xml.internal.dtm.ObjectFactory.findProviderClass
方法要求(非null)类加载器加载类定义,它永远不会缓存结果!在WebLogic环境中,此操作非常昂贵,占用了响应时间的很大一部分。
有没有理由为什么类定义永远不会被缓存?有没有办法避免每次都加载类定义?
非常感谢。
更新 com.sun.org.apache.xerces.internal.impl.dv.DTDDVFactory
类可以观察到类似的行为 - ClassLoader会在每次调用DTDDVFactory.newInstance
时重新加载类定义。
答案 0 :(得分:0)
除了避免大量使用这些标签之外,似乎没有什么可以做的。我们重构了这段代码:
只是表明在JSP中进行XML解析并不是一个特别好的想法......