# EIN Servlet & MEHRERE Clients -> Multithreading-Probl



## Zauberlehrling (9. Mai 2005)

Hallo,
also ich habe jetzt mal eine ganz, ganz dumme Frage... 

Ich habe ein Java-Servlet geschrieben, dass unter anderem globale Variablen enthält. Das Servlet läuft auf einem Tomcat-Server. Das Problem ist jetzt folgendes:
Wenn mehrer Clients auf dieses Servlet zugreifen, werden keine extra Instanzen/Prozesse dieses Servlets für jeden Client erzeugt, sondern es läuft immer nur EIN-UND-DIESELBE Servlet-Instanz. Das heisst, wenn z.B. Client A etwas in ein Textfeld schreibt (dessen Inhalt dann in einer glob. Variable gespeichert wird) und anschliessend Client B auf das Servlet zugreift, erscheint im Textfeld von Client B der Text von Client A !!!
Ich dachte bisher, dass der Tomcat diese Fallunterscheidung von alleine bewältigt, dass er die Anfragen selbsständig multithreaded - oder hab ich mich jetzt da total verpeilt und seh den Wald vor lauter Bäumen nicht? ???:L 
Muss ich den Tomcat dahingehend noch konfigurieren?? Oder muss ich das Problem selber programmiertechnisch lösen und eine Art Verwaltung dafür im Servlet programmieren??? Aber das wär doch irgendwie unsinnig, da kann ich ja gleich meinen eigenen Server schreiben.
Irgendwie bin ich jetzt ganz schön verwirrt...ich hoffe, mir kann jemand helfen. ???  :?


----------



## KSG9|sebastian (9. Mai 2005)

was soll ne globale variable sein ? und nein, tomcat macht das eigentlich von alleine. sonst hätte ich ja auf jeder seite die mit tomcat läuft adminrechte, sofern ein admin sich eingeloggt hätte


----------



## Bleiglanz (9. Mai 2005)

wenn du member des servlets meinst:

ja, genau so ist es und genau so ist es richtig!

für globale Variablen gibts den ServletContext, sollte aber sparsam eingesetzt werden


----------



## Zauberlehrling (9. Mai 2005)

Hi, 
also die Lösung für mein Problem sind die sogenannten sessions, wie man sie z.B. auch von virtuellen Einkaufskörben her kennt...


----------



## KSG9|sebastian (9. Mai 2005)

aber was genau hat das mit deiner problembeschreibung zu tun ? 

Aber nun gut, wieder ein user glücklich ;d


----------



## Zauberlehrling (9. Mai 2005)

Das Problem ist, dass für die doGet()- und doPost()-Methoden bei jedem Aufruf eine extra Instanz für jeden Client erzeugt wird. Bei globalen Variablen ist das aber nicht so, sie existieren genau einmal im ganzen Servlet und haben so für alle Clients denselben Wert. Wenn man also temporäre Daten zwischenspeichern will, muss man Sessions benutzen.


----------



## Bleiglanz (10. Mai 2005)

Zauberlehrling hat gesagt.:
			
		

> Das Problem ist, dass für die doGet()- und doPost()-Methoden bei jedem Aufruf eine extra Instanz für jeden Client erzeugt wird. Bei globalen Variablen ist das aber nicht so, sie existieren genau einmal im ganzen Servlet und haben so für alle Clients denselben Wert. Wenn man also temporäre Daten zwischenspeichern will, muss man Sessions benutzen.



Nein, der Webcontainer verwendet einen Pool von Objekten (Servlet-Instanzen), du weisst vorher nicht, welches konkrete Ding bei einer vorliegenden Abfrage mit doGet oder doPost belästigt wird

deshalb sind member-variablen tödlich, wenn sie nicht konstant sind...


----------



## Zauberlehrling (10. Mai 2005)

Das heisst, trotzdem Sessions benutzen, oder nicht?


----------



## Bleiglanz (11. Mai 2005)

Ja, wenn die Daten immer zu einer "Sitzung" gehören; wenn sie für alle Benutzer gleich sind ("application scope") dann gehören sie in den ServletContext


----------

