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]