JRE6更新24后,javax.xml.validation.Validator变得非常缓慢?

3
我们遇到了一个问题,Java JRE中的XML验证器在JRE 1.6u24中变得非常缓慢,即使在最新的更新中也存在这个问题。
对于我们来说,验证1000个XML需要:
~1.4秒的版本<= 1.6u23; ~15.2秒版本>= 1.6u24
这是慢了10倍!我试图搜索是否有人已经发现了这个问题,但我找不到任何信息。
当然,我们可以通过使用另一个库(如woodstox)来解决它,但我们更喜欢纯JRE,并且我无法相信这种情况已经存在了这么长时间而没有任何改进...
我们测试的代码看起来像这样:
public static void main(String[] args) throws XMLStreamException, SAXException, IOException, ParserConfigurationException {
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = factory.newSchema(new Source[] {
            new StreamSource(new File("schema1.xsd")),
            new StreamSource(new File("schema2.xsd")) });

    Validator validator = schema.newValidator();
    XMLInputFactory staxFactory = XMLInputFactory.newInstance();
    String xml = FileUtils.readFileToString(new File("to_validate.xml"), "UTF-8");

    Date start = new Date();
    for (int i = 0; i < 1000; i++) {
        XMLStreamReader xmlr = staxFactory.createXMLStreamReader(new StringReader(xml));
        StAXSource ss = new StAXSource(xmlr);
        validator.validate(ss);
    }
    Date end = new Date();

    System.out.println("seconds needed: " + (end.getTime() - start.getTime()) / 1000f);
}
1个回答

0

我认为Woodstox不包括XSD验证器;如果你想要一个替代方案,可以尝试使用Apache版本的Xerces(通常比JDK版本好得多)或Saxon-EE。

这种减速的最可能原因是你正在从W3C网站获取DTD。我不知道为什么这会在JDK版本之间发生变化,但肯定是一年前发生了某些变化,当时W3C决定通过故意延迟响应来限制对常见DTD的请求。如果这是问题的原因,则解决方案是使用目录将访问重定向到本地副本;或者如果您使用Saxon 9.4,则内置了最常见的DTD副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接