I have few questions. As far as I know, every request to a container becomes a HttpServletRequest. More request-> more instances of HttpServletRequest. Then, when a request object calls a servlet called ‘abc’, an instance of ‘abc’ servlet is created. Let’s say same time 3 requests come to ‘abc’ servlet ,then
(1) I want to know ,does it mean, 3 instances of ‘abc’ servlet per each request are created? or requests are queued till one request to the servlet is done.
Then let’s say,3 request to ‘abc’ servlet do some database processes which could be insertions and retrieves at the same time. Then
(2) does one request should be in the queue until other request’s servelt completes the task (synchronize)or all servelets do their DB task as multi threads as seperate tasks(not sinchronized) ?
(3). If they work as not synchronized, how can we make those tasks synchronized (lets say, only one particular task-save some thing to DB) and queued ? to do so, is it better to implement the servlet SingleThreadModel or use a method which is in a class created according to singleton pattern ? Then how it affect to the performance of the container?
In short,how can we run a particular task synchronized for all requests ?
I read this as well. That article says about servlets. Lets say the task of a servlet is handed over to another class, then I would like to know how about using singleton pattern on this?
A container may create a pool of servlet instances (an excerpt from a servlet spec below explains the details). It may use three different instances for three concurrent requests or may use one for all three. Your servlets thus need to be thread safe and shouldn’t have state in their member variables. The
SingleThreadModelmarker interface will signal to container not to use same instance of the servlet for more than one concurrent request (thus making your servlet thread-safe) but it won’t prevent the container from creating multiple instances and using them simultaneously. makes sense? if your operation requires synchronization then you handle it in your Model classes, not your Controller. So basically synchronize (or queue things up) elsewhere is the answer. Let the servlets take the command and just run with it without putting too much thoughts into the process.UPDATE. A very basic example of explicit operation synchronization for your case (not that I like it, just to illustrate the point) would be to have a singleton service handling your operation with its main
do()method declared assynchronized. Ideally, though, you would delegate database concurrency to your database and persistence layer (transactions, optimistic concurrency).CORRECTION as per the servlets spec:
With that said, you would have only one instance of your servlet unless you use that single thread model marker.