Pavel Salamon created XMLBEANS-610:
--------------------------------------

             Summary: Compiling XSD is slow since version 5.0.1
                 Key: XMLBEANS-610
                 URL: https://issues.apache.org/jira/browse/XMLBEANS-610
             Project: XMLBeans
          Issue Type: Bug
            Reporter: Pavel Salamon


In our project we use XMLBeans to compile XSD using method 
org.apache.xmlbeans.XmlBeans.compileXsd(XmlObject[], SchemaTypeLoader, 
XmlOptions)

 

After upgrading to version 5.0.1 or newer, there is a large performance drop 
inside XMLBeans. The slowness depends on JVM implementation and size of 
classpath. In our use cases we went from 4 seconds (XMLBeans 4.0) to ~3 minutes 
(XMLBeans 5.0.1).

We managed to find the reason, it's related to changed made in 
https://issues.apache.org/jira/browse/XMLBEANS-82

 

In 5.0.1 and newer versions, XMLBeans loads instance of 
javax.xml.parsers.SAXParserFactory using javax.xml.parsers.FactoryFinder which 
is very slow with larger classpaths. Stacktrace fragment shows the way from 
XmlBeans.compileXsd() to the slow classloading part:
{noformat}
    jdk.internal.loader.URLClassPath$Loader.findResource line: 626 
   jdk.internal.loader.URLClassPath$1.next line: 341 
   jdk.internal.loader.URLClassPath$1.hasMoreElements line: 351 
   java.net.URLClassLoader$3$1.run line: 687 
   java.net.URLClassLoader$3$1.run line: 685 
   java.security.AccessController.doPrivileged line: not available [native 
method]
   java.net.URLClassLoader$3.next line: 684 
   java.net.URLClassLoader$3.hasMoreElements line: 709 
   
org.springframework.boot.loader.LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.hasMoreElements
 line: 336 
   java.lang.CompoundEnumeration.next line: 3032 
   java.lang.CompoundEnumeration.hasMoreElements line: 3041 
   java.lang.CompoundEnumeration.next line: 3032 
   java.lang.CompoundEnumeration.hasMoreElements line: 3041 
   org.jetel.util.CompoundEnumeration.hasMoreElements line: 56 
   org.jetel.util.CompoundEnumeration.hasMoreElements line: 56 
   java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass line: 
1202 
   java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService line: 
1220 
   java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext line: 1264 
   java.util.ServiceLoader$2.hasNext line: 1299 
   java.util.ServiceLoader$3.hasNext line: 1384 
   javax.xml.parsers.FactoryFinder$1.run line: 287 
   java.security.AccessController.doPrivileged line: not available [native 
method]
   javax.xml.parsers.FactoryFinder.findServiceProvider line: 283 
   javax.xml.parsers.FactoryFinder.find line: 261 
   javax.xml.parsers.SAXParserFactory.newInstance line: 147 
   org.apache.xmlbeans.impl.common.SAXHelper.saxFactory line: 62 
   org.apache.xmlbeans.impl.common.SAXHelper.newXMLReader line: 47 
   org.apache.xmlbeans.impl.store.Locale.getSaxLoader line: 2227 
   org.apache.xmlbeans.impl.store.Locale.lambda$parseToXmlObject$1 line: 501 
   org.apache.xmlbeans.impl.store.Locale$$Lambda$807/0x0000000100944440.parse 
line: not available 
   org.apache.xmlbeans.impl.store.Locale.syncWrap line: 488 
   org.apache.xmlbeans.impl.store.Locale.parseToXmlObject line: 499 
   org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse line: 139 
   org.apache.xmlbeans.impl.schema.AbstractDocumentFactory.parse line: 40 
   org.apache.xmlbeans.impl.schema.SchemaTypeImpl.parseDocumentation line: 2406 
   org.apache.xmlbeans.impl.schema.SchemaTypeImpl.setParseContext line: 2256 
   org.apache.xmlbeans.impl.schema.StscTranslator.translateGlobalSimpleType 
line: 675 
   org.apache.xmlbeans.impl.schema.StscTranslator.addAllDefinitions line: 138 
   org.apache.xmlbeans.impl.schema.SchemaTypeSystemCompiler.compileImpl line: 
255 
   org.apache.xmlbeans.impl.schema.SchemaTypeSystemCompiler.compile line: 174 
   org.apache.xmlbeans.XmlBeans.compileXmlBeans line: 407 
   org.apache.xmlbeans.XmlBeans.compileXsd line: 297 {noformat}
 

In previous XMLBeans versions this classloading did not happen when method 
XmlBeans.compileXsd() was called, so it was much faster.

 

The only workarounds seem to be configuring global JVM settings like 
-Djavax.xml.parsers.SAXParserFactory. This affects other uses besides XMLBeans 
so it cannot be always done.

 

Can this behavior be configurable in any way?

Method XmlBeans.compileXsd() already takes XmlOptions instance as a parameter, 
but configuring it using XmlOptions .setLoadUseXMLReader() doesn't help as that 
property is not supported there. If we could define our own XMLReader through 
XmlOptions, we are hoping that XMLBeans would not try to load XMLReader itself 
using the slow SAXParserFactory classloading way.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to