我们遇到了一个问题,Java JRE中的XML验证器在JRE 1.6u24中变得非常缓慢,即使在最新的更新中也存在这个问题。
对于我们来说,验证1000个XML需要:
~1.4秒的版本<= 1.6u23; ~15.2秒版本>= 1.6u24
这是慢了10倍!我试图搜索是否有人已经发现了这个问题,但我找不到任何信息。
当然,我们可以通过使用另一个库(如woodstox)来解决它,但我们更喜欢纯JRE,并且我无法相信这种情况已经存在了这么长时间而没有任何改进...
我们测试的代码看起来像这样:
对于我们来说,验证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);
}