自JRE6更新24以来,javax.xml.validation.Validator非常慢?

时间:2012-08-01 16:36:39

标签: xml performance validation java

我们遇到了一个问题,即Java JRE中的XML验证器在JRE 1.6u24中变得非常慢,即使在最近的更新中也存在这种情况。

为我们验证1000个XML:

~1.4秒版本< = 1.6u23; 对于版本> = 1.6u24

,约为15.2秒

慢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 :(得分:0)

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

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