So you are creating 10 (or 200?) parsers every second? As you can imagine,
creating new parsers is really expensive. Is it possible for you to cache
the parser created by the previous JSP invocation? (Implementing a parser
pool, for example.)

Thanks,
Sandy Gao
Software Developer, IBM Canada
(1-905) 413-3255
[EMAIL PROTECTED]



                                                                                
                                                
                      "Cameron Hart"                                            
                                                
                      <[EMAIL PROTECTED]        To:       <[EMAIL PROTECTED]>   
                                      
                      a.govt.nz>               cc:                              
                                                
                                               Subject:  Xerces-2 DOMParser 
bottleneck                                          
                      03/19/2003 12:42                                          
                                                
                      AM                                                        
                                                
                      Please respond to                                         
                                                
                      xerces-j-user                                             
                                                
                                                                                
                                                
                                                                                
                                                




I'm running a servlet under tomcat that DOM parses a couple of xml docs,
grabs relevant nodes and serializes the new doc into xhtml output. I
have found a bottleneck (or deadlock?) when the servlet is under load.
The bottleneck can easily be demonstrated by running a load test against
the attached jsp. We use OpenSTA to test with 20 VU's requesting the
page every 1/10th of a second. If you do a thread dump after the CPU has
been sitting at 100% you should say many of the threads are at
org.apache.xerces.impl.dv.DTDDVFactory.getInstance - waiting to lock.
This behaviour is killing our webapp under not much load (a lot less
load that we ran our test at).

Is this a problem with Xerces? Is there something we can do to avoid
this behaviour? We were thinking about creating a pool of DOMParser
objects and see if that helps.

The following are the thread dumps that is locked and one of the
waiting thread. Attached is a jsp and an html page we used to replicate
the problem.



"Thread-46" daemon prio=5 tid=0x1836D8E0 nid=0xbcc waiting on condition
[1ac4e000..1ac4fdc0]
at java.lang.StringBuffer.expandCapacity(StringBuffer.java:202)
at java.lang.StringBuffer.append(StringBuffer.java:392)
- locked <02AF19A0> (a java.lang.StringBuffer)
at
org.apache.catalina.loader.StandardClassLoader.toString(StandardClassLoader.java:571)

at
org.apache.catalina.loader.WebappClassLoader.toString(WebappClassLoader.java:906)

at java.lang.String.valueOf(String.java:2177)
at java.lang.StringBuffer.append(StringBuffer.java:361)
- locked <02AF19D0> (a java.lang.StringBuffer)
at org.apache.xerces.util.ObjectFactory.newInstance(Unknown Source)
at org.apache.xerces.impl.dv.DTDDVFactory.getInstance(Unknown Source)
- locked <12D15BC0> (a java.lang.Class)
at org.apache.xerces.impl.dv.DTDDVFactory.getInstance(Unknown Source)
- locked <12D15BC0> (a java.lang.Class)
at
org.apache.xerces.parsers.DTDConfiguration.createDatatypeValidatorFactory(Unknown

Source)
at org.apache.xerces.parsers.DTDConfiguration.<init>(Unknown Source)
at org.apache.xerces.parsers.StandardParserConfiguration.<init>(Unknown
Source)
at
org.apache.xerces.parsers.IntegratedParserConfiguration.<init>(Unknown
Source)
at
org.apache.xerces.parsers.IntegratedParserConfiguration.<init>(Unknown
Source)
at sun.reflect.GeneratedConstructorAccessor15.newInstance(Unknown
Source)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
at java.lang.Class.newInstance0(Class.java:306)
at java.lang.Class.newInstance(Class.java:259)
at org.apache.xerces.util.ObjectFactory.newInstance(Unknown Source)
at org.apache.xerces.util.ObjectFactory.findJarServiceProvider(Unknown
Source)
at org.apache.xerces.util.ObjectFactory.createObject(Unknown Source)
at org.apache.xerces.util.ObjectFactory.createObject(Unknown Source)
at org.apache.xerces.parsers.DOMParser.<init>(Unknown Source)
at org.apache.xerces.parsers.DOMParser.<init>(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.<init>(Unknown Source)
at
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(Unknown

Source)
at
org.apache.jsp.domparser_0002dlock_jsp.
_jspService(domparser_0002dlock_jsp.java:64)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:204)

at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)

at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2407)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)

at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)

at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:261)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:360)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:632)
at
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:590)

at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:707)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530)

at java.lang.Thread.run(Thread.java:536)


"Thread-45" daemon prio=5 tid=0x183F4DC8 nid=0xd70 waiting for monitor
entry [1ac0f000..1ac0fdc0]
at org.apache.xerces.impl.dv.DTDDVFactory.getInstance(Unknown Source)
- waiting to lock <12D15BC0> (a java.lang.Class)
at
org.apache.xerces.parsers.DTDConfiguration.createDatatypeValidatorFactory(Unknown

Source)
at org.apache.xerces.parsers.DTDConfiguration.<init>(Unknown Source)
at org.apache.xerces.parsers.StandardParserConfiguration.<init>(Unknown
Source)
at
org.apache.xerces.parsers.IntegratedParserConfiguration.<init>(Unknown
Source)
at
org.apache.xerces.parsers.IntegratedParserConfiguration.<init>(Unknown
Source)
at sun.reflect.GeneratedConstructorAccessor15.newInstance(Unknown
Source)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
at java.lang.Class.newInstance0(Class.java:306)
at java.lang.Class.newInstance(Class.java:259)
at org.apache.xerces.util.ObjectFactory.newInstance(Unknown Source)
at org.apache.xerces.util.ObjectFactory.findJarServiceProvider(Unknown
Source)
at org.apache.xerces.util.ObjectFactory.createObject(Unknown Source)
at org.apache.xot
org.apache.catalina.erces.util.ObjectFactory.createObject(Unknown
Source)
at org.apache.xerces.parsers.DOMParser.<init>(Unknown Source)
at org.apache.xerces.parsers.DOMParser.<init>(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.<init>(Unknown Source)
at
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(Unknown

Source)
at
org.apache.jsp.domparser_0002dlock_jsp.
_jspService(domparser_0002dlock_jsp.java:64)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:204)

at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)

at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)

at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2407)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)

at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)

at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)

at
org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)

at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at
org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:261)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:360)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:632)
at
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:590)

at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:707)
at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530)

at java.lang.Thread.run(Thread.java:536)



********************************************************************************

This email may contain legally privileged information and is intended only
for the addressee. It is not necessarily the official view or
communication of the New Zealand Qualifications Authority. If you are not
the intended recipient you must not use, disclose, copy or distribute this
email or
information in it. If you have received this email in error, please contact
the sender immediately. NZQA does not accept any liability for changes made
to this email or attachments after sending by NZQA.

All emails have been scanned for viruses and content by MailMarshal.
NZQA reserves the right to monitor all email communications through its
network.

********************************************************************************



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

#### index.html has been removed from this note on March 19 2003 by Sandy
Gao
#### domparser-lock.jsp has been removed from this note on March 19 2003 by
Sandy Gao



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to