# Vermeiden von multiplen Threads bei refresh



## aldi15 (12. Dez 2007)

Hallo miteinander,
ich habe folgendes Problem: in einer JSP-Seite deklariere (und initialisiere) ich eine sessionweite Variable auf die ich auch von anderen JSPs aus Zugriff habe mit: 
	
	
	
	





```
session.setAttribute("MyClient", new ClientMainClass(SessionID));
```
Wenn ich nun irgendeine Aktion starte wie zB. ein Formular auslesen (request abschicken) etc. wird die ganze Seite refreshed. Damit wird leider diese Anweisung neu ausgeführt und ein neues Objekt erzeugt. Dies führt zu multiplen Objekten und damit zu multiplen Threads, die sich im Laufe der Anwendung gegenseitig in die Quere kommen (lesen und schreiben eine Datei gleichzeitig). In einem normalen Javaprogramm hätte ich die Variable wahrscheinlich als final deklariert, dann wäre es egal, wie oft der Code ausgeführt wird, aber hier? Wie kann ich es schaffen, daß beim Starten einer neuen Session nur einmal ein Objekt erzeugt wird und danach nicht mehr (auch nicht bei einem refresh)?
Danke und bis dann
Albrecht


----------



## maki (12. Dez 2007)

Frage doch ab, ob das Attribut schon da ist, bevordu es nochmal setzt.

Die SessionID manual zu setzen und zu verwenden birgt Risiken und verursacht Aufwand, was passiert zB. bei einem Timeout???

Abgesehen davon bekommst du die Session über das request Objekt:


```
request.getSession();
```
bzw.

```
request.getSession(boolean);
```

Ich hab manchmal das Gefühl, Leute lesen sich nicht in die Themen ein sondern probieren einfach mal wild darauf los...

Nachtrag: Sehe gerade dass du die Session nicht in ein Attribut setzt, mein Fehler, nix für ungut 
Ansonsten solltest du trotzdem abfragen ob das Attribut schon gesetzt ist bevor du es setzt.


----------



## Guest (12. Dez 2007)

Gar nichts passiert bei einem Timeout, denn ich setzte die SessionID nicht manuell (es ist nicht immer alles so, wie es auf den ersten Blick scheint  :wink: ). Ich benutze hier nur die Session als unique identifier, und verwende sie weiter als Dateiname. Ich hätte mir auch sonstwie einen GUID beschaffen können, aber das schien mir der einfachste Weg. ClientMainClass ist hier nur eine normale java-Klasse kein Servlet.
Zu deiner Antwort: Ich habe mir das auch schon überlegt. In einem normalen Programm hätte ich abgefragt, ob das Objekt Null ist. Aber ich kann hier doch nicht mit session.getAttribute vorab ein Objekt abfragen, das ich erst danach mit session.setAttribute anlege? das müsste einen Laufzeitfehler geben oder?
Gruß und Danke
Albrecht


----------



## maki (12. Dez 2007)

> Zu deiner Antwort: Ich habe mir das auch schon überlegt. In einem normalen Programm hätte ich abgefragt, ob das Objekt Null ist. Aber ich kann hier doch nicht mit session.getAttribute vorab ein Objekt abfragen, das ich erst danach mit session.setAttribute anlege? das müsste einen Laufzeitfehler geben oder?


Doch das geht


----------



## aldi15 (13. Dez 2007)

Tatsächlich   
Es scheint mir zwar nicht ganz logisch (weswegen ich es auch nicht vorab ausprobiert hab  :wink: ) aber es geht! Super. Jetzt läuft alles stabil.
Danke
Albrecht


----------



## maki (13. Dez 2007)

> Es scheint mir zwar nicht ganz logisch


Es ist logisch 

session.getAttribute(key) sieht nach, ob es das Attribut schon gibt, wenn nicht, bekommst du null zurück, so wie bei einer Hashmap auch


----------



## aldi15 (13. Dez 2007)

:idea: Ja, jetzt ist es mir auch klar. Session besitzt als implizites Objekt die Map, in der eben alle mögl. Attribute eingetragen werden können und die sind lediglich Strings und damit abfragbar. Das heißt dann noch nicht, dass auch ein Objekt mit dem Namen erstellt sein muss. Aber wenn ein sessionweites Objekt erstellt wird, wird es eben auch durch die Methode sesson.setAttribute in die Map eingetragen.
Danke + bis dann
Albrecht


----------



## maki (13. Dez 2007)

Richtig.

Für die anderen "Scopes" (application, request, page) trifft dasselbe zu.


----------

