Newsgroup: it.comp.java
Titolo: servlet e concorrenza...con Tomcat (lungo...ma semplice)

ciao a tutti
ciao!
avevo postato un msg simile tempo fa, riguardante RMI, ora ho altri
dubbi...che non riguardano RMI.
ho un'applicazione di jsp che utilizzano una servlet per operazioni di
memorizzazione dei dati in un database MySql e che permette di passare
alle successive pagine Jsp.
Il tutto gira sotto Tomcat e vorrei che fosse multithread.
In pratica facendo partire l'applicazione, e collegandosi all'url
http://127.0.0.1:8080/MyApplication
 si accede ad una pagina jsp con un
menu, col quale si possono inserire dati in un db, leggere dati dal db
ecc
Il tutto funziona se una sola persona si collega all'url...ma, come
detto, vorrei che piu persone contemporaneamente potessero collegarsi
e fare le stesse operazioni in parallelo.
Allora riassumo i miei dubbi:
(1)dubbio
Da quello che ho letto sulle servlet e le Jsp, risulta  che la
servlet, che chiamero' MyServlet, viene inizializzata SOLO la prima
volta che viene chiamata dalle jsp...questa servlet la prima  e unica
volta che viene inizializzata, crea la connessione al db con:
Connection con= crea connessione ecc
Nel libro si consiglia di fare questa operazione nel costruttore della
servlet perche  e' un operazione lunga....ci mette qualche secondo, e
quindi viene fatta nel costruttore della servlet proprio per farla una
unica volta.
Faccio bene a operare in questo modo?
Inoltre il libro sostiene che ogni utente avra' una propria istanza di
servlet, quindi con i propri dati, metodi ecc.
Il dubbio e':
La prima persona che si collega al sito inizializzera la servlet...e
quindi tutte le altre persone lavoreranno con la propria istanza della
stessa servlet...quindi se la servlet e' cosi:
public class MyServlet extends HttpServlet 
String str;
public void insertDati()
	{
	  String pid=new String();
 
	 ecc	
	}		
}
l'attributo GLOBALE str e' comune a tutte le istanze?cioe se un primo
utente esegue str="ciao" e successivamente un altro utente scrive
str="hello", allora la stringa str sara' uguale per TUTTI gli utenti a
"hello"...o no?
viceversa se la stessa cosa avviene per la stringa pid, LOCALE al
metodo insertDati, questo non e' vero, visto che tale stringa e'
locale per ogni istanza...quindi le modifiche fatte da un utente a
tale stringa sono visibili solo al'utente stesso...giusto?
 
(2) dubbio
se la servlet e' cosi:
public class MyServlet extends HttpServlet 
 Insert i;
 public void init() 	throws  ServletException
    {
	   i=new Insert();
    }
e dove Insert e':
public class Insert{
Statement stm;
ResultSet rs;
 
public Insert()	{  
  try	{
   // Connessione al database
   Connection conn = connessione al db MySql (
   stm=conn.crea statement;
   rs=stm.crea result set;
  }
  catch(Exception exc)	{
   }
} 
cio' significa che la prima (e unica volta) che viene inizializzata la
servlet, si chiama la classe Insert, la quale si connette al
database...dato che l'inizializzazione viene fatta una sola volta,
tutti gli utenti avranno come detto una propria istanza di
MyServlet...ma avranno anche una propria istanza di Insert?
Cioe'visto che MyServlet esegue i=new Insert() una sola volta,a me
sembra che tutti gli utenti condivideranno la stessa Insert!
e questo e'  un problema perche allora tutti condividerebbero la
stessa connessione, lo stesso statement e lo stesso resultset!
Quindi se un utente eseguisse una scrittura su db  e subito dopo lo
facesse anche un altro utente, tutto avverrebbe sullo stesso
statement, e facendo un commit per il primo utente si farebbe
involontariamente anche per il secondo!
Insomma,o sto facendo confusione, oppure esiste un metodo piu semplice
per fare quello che spero abbiate capito voglio fare...
insomma creare una connessione per ogni utente, che ha il proprio
statement e resultset, e tutti possano usare il db in parallelo (visto
che MySql supporta il multithreading).
Sapete consigliarmi???
grazie mille e scusate la lunghezza eccessiva del post, ma volevo
essere chiaro ;)
____________________________________________________________________________________
email : 
filip...@libero.it

 ha scritto nel messaggio
news:3c52b800...@powernews.libero.it...


 servlet deve implementare l'interfaccia SingleThreadModel.
Il SingleThreadModel non va usato ed e' come se non esistesse: risolve 
zero problemi e ne crea molti. *NON* va mai usato, per cui l'assunzione 
di avere sempre e solo una sola istanza che risponde a tutti i client e' 
correttissima.
uL

Sapete consigliarmi???
Nei driver MySQL (
http://www.mysql.com/downloads/api-jdbc.html
) trovi
il supporto per le estensioni jdbc2. Dai un'occhiata al connection
pooling.

 ha scritto nel messaggio
news:3C52C93B...@flashnet.it...
