interesting, can you provide your webapp + configs for download and test? Leon
On Tue, Jul 1, 2008 at 3:16 PM, Fredrik Tolf <[EMAIL PROTECTED]> wrote: > On Tue, 2008-07-01 at 08:46 +0200, Leon Rosenberg wrote: >> Hello Frederic, >> >> unless you are using the SingleThreaded Model (and you shouldn't) >> tomcat does no such thing. > > There's no way I could be doing any such thing unknowingly, such as it > being the default, right? > >> I assume the best way is to show us your servlet code, or to check for >> synchronized blocks in it. > > The dispatch code is quite simple: > > protected void doGet(HttpServletRequest req, HttpServletResponse resp) { > try { > req.setCharacterEncoding("UTF-8"); > resp.setCharacterEncoding("UTF-8"); > } catch(UnsupportedEncodingException e) { > throw(new AssertionError(e)); > } > try { > if(req.getPathInfo().equals("/")) { > redirect(req, resp, "/ls"); > } else if(req.getPathInfo().equals("/ls")) { > req.setAttribute("db", load()); > Thread.sleep(10000); > getServletContext().getNamedDispatcher("index") > .forward(req, resp); > } else if(req.getPathInfo().equals("/adm")) { > req.setAttribute("db", load()); > Thread.sleep(10000); > getServletContext().getNamedDispatcher("admin") > .forward(req, resp); > } else if(req.getPathInfo().equals("/css")) { > getServletContext().getNamedDispatcher("style") > .forward(req, resp); > } else { > error(req, resp, 404, "Resource not found"); > } > } catch(Exception e) { > log("Caught exception", e); > error(req, resp, 500, "Internal error"); > } > } > > You can see the Thread.sleep calls that I mentioned. The `load' function > does no synchronization whatsoever. > > I followed Steffen Heil's advice on sending a SIGQUIT to Tomcat to get > the thread dump, and the results are as follows: > > When I'm running one request to "/ls" and one to "/adm" simultaneously, > there are indeed two threads in the doGet function above, one sleeping > on the first Thread.sleep call and one on sleeping on the other. > > When, on the other hand, I'm running two requests to "/ls" > simultaneously, there is only one thread from the pool in the doGet > function. All other threads in the pool are sleeping with the following > stack trace: > > java.lang.Thread.State: WAITING (on object monitor) > at java.lang.Object.wait(Native Method) > - waiting on <0x95401098> (a org.apache.tomcat.util.threads.ThreadPool > $ControlRunnable) > at java.lang.Object.wait(Object.java:485) > at org.apache.tomcat.util.threads.ThreadPool > $ControlRunnable.run(ThreadPool.java:656) > - locked <0x95401098> (a org.apache.tomcat.util.threads.ThreadPool > $ControlRunnable) > at java.lang.Thread.run(Thread.java:619) > > Except one, which is trying to accept a connection from the listening > socket, but that seems to be the idle condition (it does that when I'm > running the dual requests to "/ls" and "/adm" as well). > > By the way, this is Tomcat 5.5.17. Might that matter? > > Fredrik Tolf > > > > --------------------------------------------------------------------- > To start a new topic, e-mail: users@tomcat.apache.org > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To start a new topic, e-mail: users@tomcat.apache.org To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]