You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by "PJ Fanning (Jira)" <ji...@apache.org> on 2022/06/02 18:08:00 UTC

[jira] [Updated] (XMLBEANS-610) Compiling XSD is slow since version 5.0.1

     [ https://issues.apache.org/jira/browse/XMLBEANS-610?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

PJ Fanning updated XMLBEANS-610:
--------------------------------
    Fix Version/s: Version 5.1.1

> 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
>            Priority: Major
>             Fix For: Version 5.1.1
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> 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: dev-unsubscribe@poi.apache.org
For additional commands, e-mail: dev-help@poi.apache.org