Newsgroup: it.comp.java
Titolo: Problemi con servlet

Ho creato un servlet che prende in input dei parametri e dopo avere
consultato un database risponde in output con una pagina html.
Il tutto  funziona bene fintanto che si fa una richiesta per volta;
se invece contemporaneamente due o piu' client fanno la stessa
richiesta allora succede un casino.
I client ricevono risposte parziali e mi č anche capitato che un client ha
ricevuto
anche le informazioni che sarebbero dovute andare all'altro client.
Pensavo che la gestione delle richieste concorrenti da piu' client fosse
implicita, e invece mi sono accorto che non č cosě.
Ho momentaneamente risolto il problema implementando l'interfaccia
"SingleThreadModel".
Questa perň non mi sembra la maniera piu' corretta per risolvere il
problema.
Qualcuno mi puo' aiutare?
Grazie, Vincenzo
-- 
Posted from [213.217.145.1] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

anche le informazioni che sarebbero dovute andare all'altro client.
in che server fai girare la tua servlet?
Kali

Il web server sui cui gira la servlet è Apache 1.3.9 con il modulo jserv.


Il web server sui cui gira la servlet è Apache 1.3.9 con il modulo jserv.
Come viene generata esattamente la pagina? Se c'e` di mezzo JDBC,
sembra un problema legato all'uso concorrente di un oggetto Connection
quando ci sono piu` richieste contemporaneamente, e quindi piu`
thread. In questo caso o si limita la Servlet a eseguire una richiesta
alla volta (con la keyword synchronized), ma ovviamente potrebbe
essere inaccettabile, oppure si implementa un connection pool.
NB: l'architettura delle Servlet prevede la gestione di piu` richieste
contemporanee, ma lascia a te gestire il problema dell'acesso
simultaneo a risorse condivise.

 
Come hai intuito la gestione di richieste concorrenti non č automatica.
Puoi risolvere il problema in diverse maniere:
1) Come hai fatto tu, ovvero facendo in modo che le servlet implementino 
SingleThreadModel. Il problema diventa aquesto punto di prestazioni, 
sopratutto con Tomcat.
2) Evitando di utilizzare varibili di istanza (che non essendo thread-
safe sono la causa dei tuoi problemi in particolare di quello in cui un 
client riceve la risposta destinata all'altro) e stando attento ai 
possibili problemi derivati dall'accesso concorrente a variabili 
statiche.
3) Se stai utilizzando un JDK 1.2.x o successivo puoi wrappare le 
variabili di istanza con un oggetto della classe java.lang.ThreadLocal, 
che risolve i tuoi problemi di accesso concorrente.
Dalla documentazione del JDK 1.2:
   ---------------------------------------------------------------------
   This class provides ThreadLocal variables. These variables differ from 
   their normal counterparts in that each thread that accesses one (via 
   its get or set method) has its own, independently initialized copy of 
   the variable. ThreadLocal objects are typically private static 
   variables in classes that wish to associate state with a thread (e.g., 
   a user ID or Transaction ID). 
   Each thread holds an implicit reference to its copy of a ThreadLocal 
   as long as the thread is alive and the ThreadLocal object is 
   accessible; after a thread goes away, all of its copies of ThreadLocal 
   variables are subject to garbage collection (unless other references 
   to these copies exist). 
   ---------------------------------------------------------------------
Se utilizzi un servlet engine come JRun e modificare il design di ogni 
servlet ti sembra troppo lavoro puoi anche lasciare tutto in 
SigleThreadModel. JRun infatti in questo caso istanzia tanti 
oggetti servlet quanti gliene indichi nel JRun.properties (parametro 
initPool[qualcosa...]) e smista le richieste su questo pool di servlet.
Quindi ottieni comunque un comportamento multithreaded. Anche WebSphere 
funziona cosě. Con Tomcat, almeno fino a quando l'ho provato io (mi 
sembra 3.1) non ho trovato nulla del genere.
Saluti
Alessio