Tomcat: Sessions bleiben zu lange erhalten

tme

Aktives Mitglied
Hallo,

wir haben eine J2EE-Applikation auf einem Tomcat-Server zu laufen. User machen per Browser Webrequests, die durch mehrere Listener laufen. Einer dieser Listener wurde eingerichtet, um die Sessions zu zählen und Informationen über Zahlen und Daten Sessions vorzuhalten.

Wir hatten Probleme mit der Menge an Sessions. Wir haben daraufhin den Session-Timeout des Tomcat-Servers von 30 auf 10 Minuten reduziert:

Java:
web.xml:        <session-timeout>10</session-timeout>

Wenn wir jetzt in unserem Programm die Liste der Sessions durchgehen, fällt auf, dass viele Sessions existieren, die Idle-Zeiten von mehr als 600 Sekunden vorweisen.

Haben wir die Einstellung "session-timeout" falsch verstanden?

Danke.
 
S

SlaterB

Gast
was stellst du dir denn vor, soll nach den 600 Sekunden passieren?
und passiert dies vielleicht jetzt schon nur später? wann denn dann, nach wieviel Sekunden?

vielleicht ist die Session für den Webserver schon geschlossen, nur kannst du das nicht erkennen wie auch immer du derzeit nachschaust,
vielleicht wird sie gerade nicht geschlossen, weil du sie in einer Liste hälst (das wäre sicher ungewöhnliches Pech)

oder beschreibst du oben eine Auswertung von neuen Requests, wobei nur nachgeschaut wird, ob in der Session eine entsprechende Information gesetzt ist?
dann schon systematisches Vorgehen versucht, neuer Request nach 500 Sekunden, 550, 600, 650, ..
nach wieviel Sekunden ist sie weg, ist das immer so oder wechselhaft?

verwendest du/ ihr HttpSessionListener mit sessionDestroyed() oder ähnliches?
Servlet: session listener : SessionServletsJava

(bis auf Fragen leider keine direkten Informationen ;) )

edit:
im gelinkten Beispiel steht
setMaxInactiveInterval(),
das schon benutzt und/ oder mit getMaxInactiveInterval() die bisherige Einstellung geprüft?
: Interface HttpSession
 
Zuletzt bearbeitet von einem Moderator:

FArt

Top Contributor
Ein Timeout-Parameter legt in der Regel fest, wie lang eine Session garantiert zur Verfügung steht, nicht nach welcher Zeit sie garantiert nicht mehr existiert. Dem Container ist überlassen, ob die Session u.U. noch länger existiert, das hängt von der Implementierung ab. In der Spec ist das nicht spezifiziert.
 

tme

Aktives Mitglied
Hallo Slater,

danke für die Antwort.

was stellst du dir denn vor, soll nach den 600 Sekunden passieren?

Bei uns hängen einige Daten nur an der Session, wie ein temporärer Warenkorb, ein Phantomnutzer (unangemeldet) oder ein echter Nutzer (angemeldet), Benutzerrechte, Preise usw. Wir sehen zu Spitzenzeiten Ca. 4000 Sessions auf dem System, was so ungefähr ein Wert ist, bei dem unser Server manchmal in die Knie geht.

Wir würden gerne, dass das Session-Objekt nach dieser Zeit invalid wird. Ein Nutzer, der also mit dieser Session im Shop unterwegs ist und X Sekunden (in unserem Falle also 600) keinen neuen Request produziert, soll abgemeldet werden, also die Objekte, die mit seiner Session verbunden sind, verworfen werden.

und passiert dies vielleicht jetzt schon nur später? wann denn dann, nach wieviel Sekunden?

Nunja, nachdem ich viele zusätzliche Einstellungen für die Protokollierung der Ausführung des GC bereits integriert habe, ist zu den Spitzenzeiten zu sehen, dass der GC vergeblich versucht, Objekte zu collecten (ca. alle 7.5 Sekunden crawlt er 4.5GB Objekte durch). Wir vermuten stark, dass es sich bei einem Großteil um Sessions handeln, die vom Nutzer her bereits invalid sind, also z.B. ein geschlossener Browsertab nach Bestellungen oder Leute, die den Shop offen haben und dann in die Mittagspause gehen.

vielleicht ist die Session für den Webserver schon geschlossen, nur kannst du das nicht erkennen wie auch immer du derzeit nachschaust, vielleicht wird sie gerade nicht geschlossen, weil du sie in einer Liste hälst (das wäre sicher ungewöhnliches Pech)

Letzteres würde ich ausschließen wollen, da nicht oft jemand die Liste der Sitzungen prüft.

verwendest du/ ihr HttpSessionListener mit sessionDestroyed() oder ähnliches?

Genau diese, also sessionCreated() und sessionDestroyed() werden über die Listener aufgerufen und tätigen die Einträge in eine ArrayList.

im gelinkten Beispiel steht
setMaxInactiveInterval(),
das schon benutzt und/ oder mit getMaxInactiveInterval() die bisherige Einstellung geprüft?
: Interface HttpSession

Guter Hinweis. Besteht also dann unsererseits ein Verständnisproblem über den Mechanismus, der Sessions invalidiert? Wir waren der Meinung, dies würde der Tomcat über seine Listenerchain aktivieren und entsprechend nach dem eingestellten Intervall deaktivieren, wobei die Session dann aus der ArrayList entfernt wird und vom GC geholt werden kann.

Wie würde denn dann die von dir genannte Einstellung mit der Einstellung in der Tomcat-Konfiguration zusammenarbeiten? Bedeuten die Einstellungen unterschiedliche Dinge? Ist die Einstellung der Tomcat-Konfiguration gar der Default-Wert für die Session, welcher jedoch mit der von dir genannten Funktion übersteuert werden kann?

Danke.
 
S

SlaterB

Gast
ich kann dazu leider nix genaues sagen, aktuell nicht mal ausprobieren, bin da nich drin,
nur allgemeine Hinweise:
immer noch offene Frage: werden denn die Sessions überhaupt irgendwann zerstört, das sollte sich doch prüfen lassen,
wieviel Sekunden sind es dann, immer gleich oder unterschiedlich, Statistik aufstellen

> Letzteres würde ich ausschließen wollen, da nicht oft jemand die Liste der Sitzungen prüft.

prüfen an sich mag nicht wichtig sein, aber die Sessions sind doch wohl die ganze Zeit in irgendwelchen Listen?
na auch egal, daran kann es ja nicht liegen,

aber diese Liste kann man als Vorteil nutzen, irgendein Thread durchläuft die alle 10 Sek.,
wenn er bei einer Session eine Idle-Zeit von > 600 feststellt, dann sperrt er diese Session, löscht alle zugehörigen Daten, setzt eine Information 'vorerst Ende' usw.,
ganz egal welchen Status Tomcat für diese Session vorsieht,

interessant wirds, wenn der User dann doch noch mal wiederkommt und Tomcat die alte Session weiterverwendet,
alle Programmteile müssen dann damit umgehen können, dass das mehr oder weniger eine ganz neue frische Session ist,
auch wenn es ein Objekt ist, welches schon mal da war,
sollte möglich sein, wenn die Session quasi leer ist, geht höchstens um die SessionId, hashCode(),
ich finde darauf sollte man sich eh nicht verlassen, was der Server macht ist eh eine Blackbox, der könnte glatt offiziell beendete Session-Objekte später für andere User wiederverwenden ;)
nur selber gesetzte Daten zählen

edit: allerdings kommt man dann nicht (immer) bei offiziellen Methoden wie sessionCreated()/ Destored() vorbei,
daher evtl. nicht so leicht umsetztbar, das Session-Handling müsste allgemein bei jedem Request passieren

-------

siehe auch Antwort von FArt
 
Zuletzt bearbeitet von einem Moderator:

FArt

Top Contributor
Analysiere mal die Logfiles. Dort wirst du sehen, wann Tomcat eine Session erstellt, wann er sie löscht usw.
Dann ist auch eindeutig zu sehen, wie viele Sessions "zu Spitzenzeiten" aktiv sind (und dann wohl auch nötig sind). Ich gehe davon aus, dass Tomcat die Sache mit den Sessions und Timeouts drauf hat ;-)

Wenn wirklich so viele Sessions nötig sind, musst du nicht am Timeout drehen sondern die Webapplikation skalieren. Eine einfache Lösung wären zwei Tomcats mit einem Apache und ModJK davor.
Man kann auch Tomcat so konfigurieren, dass er eine Session nach kurzer Zeit passiviert (persistiert) und aus dem Speicher entfernt, da viele Sessions oft lange Zeit keine Request beantworten (das sind glaube ich Konfigurationsparameter, die irgendwas mit IDLE heißen) und nur relativ wenige Sessions tatsächlich aktiv sein müssen. Wie sinnvoll das ist hängt aber stark von der Applikation ab (also wie sie verwendet wird) und wie viele Daten an einer Session hängen (Overhead durch Marshalling/Unmarshalling).
 
M

maki

Gast
Wir vermuten stark, dass es sich bei einem Großteil um Sessions handeln, die vom Nutzer her bereits invalid sind, also z.B. ein geschlossener Browsertab nach Bestellungen oder Leute, die den Shop offen haben und dann in die Mittagspause gehen.
Vermuten = Raten

Ist gar nicht nötig mit den heutigen Tools, von VisualVM & anderen allgemeinen JMX Tools bis hin zu LambdaProbe, welches speziell für Tomcat entworfen wurde und in der Lage ist Fragen wie "Wie viele Sessions sind noch offen, wie groß sind diese und welche Objekte stecken da drin" direkt zu beantworten.
 
M

maki

Gast

FArt

Top Contributor
Ich meinte natürlich die Tools wie JVisualVM und andere JMX Tools (und Profiler).

Lambdaprobe ist gut, aber dennoch erst die zweite Disziplin... IMHO....
 
M

maki

Gast
Ok, sehe ich ein :)

Logs sind nunmal auch in der Lage Dinge zu dokumenteiren die "nicht gerade jetzt" passiert sind, da nutzen JMX Tools wenig.
 

Java.getSkill()

Aktives Mitglied
Eine noobbemerkung, aber kannst du, wenn du die liste durchgehst und bei jeder session nachfragst, wie lange sie inaktiv ist, nicht einfach

Java:
session.invalidate()

machen?
 

tme

Aktives Mitglied
Eine noobbemerkung, aber kannst du, wenn du die liste durchgehst und bei jeder session nachfragst, wie lange sie inaktiv ist, nicht einfach

Java:
session.invalidate()

machen?

Huhu und danke für die Antwort,

derzeit suche ich noch nach einem Automatismus, mit dem die Sessions entfernt werden können. Ich gehe davon aus, dass ein Mechanismus vom Tomcat wasserdichter sein wird als eine Routine, die ich mir zu diesem Thema aus den Fingern saugen kann.

In jedem Falle ist Probe ein Klasse Tool und hat ersteinmal sehr viel weitergeholfen.

Danke.
 

tme

Aktives Mitglied
Die Lösung für das Problem war relativ banal:

Trotz Konfiguration von Tomcat auf ein Timeout von 10 Minuten baute das übernommene Ant-Skript eine spezielle web.xml mit in das .WAR-Archiv, welche noch einen Timeout von 30 Minuten hatte. Dank Probe wurde dieser Umstand klar. Eine Änderung dort hat den gewünschten Effekt gebracht, Sessions werden jetzt kurz nach Ablauf einer Idle-Time von 10 Minuten collected.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Tomcat Application Path bestimmen Allgemeines EE 0
TheWhiteShadow JSF plugins für tomcat webapp Allgemeines EE 0
X Tomcat checkParachute Allgemeines EE 3
C Servlet Tomcat/Jersey findet REST-Service nicht Allgemeines EE 3
J Global JNDI Tomcat Allgemeines EE 0
N WebService WAR-File auf Tomcat-Server Allgemeines EE 1
C WebSocket in Tomcat wirft 404 Allgemeines EE 0
S Eclipse mit Tomcat und Jersey Allgemeines EE 7
S Fehlersuche in Eclipse/Tomcat -> Error-log?? Allgemeines EE 2
S Tomcat und 404 -> von jetzt auf gleich Allgemeines EE 4
L JNDI auf Tomcat mit EE Allgemeines EE 4
E Servlet Tomcat Method Signature Resolution Allgemeines EE 7
J Logging und Monitoring unter Tomcat Allgemeines EE 2
aze Tomcat:Error Pages werden nicht angezeigt Allgemeines EE 4
D JSF JSF 2.0 + ICEFaces + Tomcat 7 Allgemeines EE 3
R Sessionmanagement und Tomcat Allgemeines EE 6
W Tomcat Support mit SLA? Allgemeines EE 3
P Tomcat lädt falsche Datei obwohl richtig angegeben Allgemeines EE 11
N Tomcat funktioniert nach shutdown/startup nicht mehr korrekt Allgemeines EE 9
B Tomcat, JNDI und datasource - Konfiguartion Allgemeines EE 2
JimPanse Tomcat Fehler nach redeploy Allgemeines EE 5
A Java Tomcat findet Website nicht Allgemeines EE 8
S Anfängerfrage Eclipse/Tomcat Allgemeines EE 4
H Installer für Tomcat-Anwendung Allgemeines EE 5
A Tomcat in Eclipse Allgemeines EE 11
C Tomcat Zugriff auf lokale Dateien Allgemeines EE 2
A Tomcat, Exceptions beim redeploy Allgemeines EE 4
P Hilfe: Tomcat periodischer Absturz Allgemeines EE 5
MQue Tomcat reload Allgemeines EE 4
neurox Tomcat stoppen Allgemeines EE 1
S Unterschied zwischen Tomcat und Application Server? Allgemeines EE 3
MQue Tomcat PermGen Allgemeines EE 7
MQue Tomcat Methodenaufruf Allgemeines EE 3
P Eclipse Tomcat Plugin funktioniert nicht mit externem TC-Server? Allgemeines EE 4
MQue TCP- Verbindung nach Tomcat- Start (global) starten Allgemeines EE 4
reibi Tomcat Proxy eintragen Allgemeines EE 2
P CXF Project auf Tomcat laufen lassen - wie? Allgemeines EE 35
R (TOMCAT] Installation Tomcat auf WinXP Allgemeines EE 8
S Tomcat + Eclipse Allgemeines EE 6
T Security Manager in Tomcat Allgemeines EE 2
S Unterschiedliche Pfade bei Tomcat Allgemeines EE 4
ps EJB3 in Tomcat. das hat selbst mich erstaunt Allgemeines EE 18
B Tomcat Manager - .war Datei hochladen. Einfache Frage Allgemeines EE 5
G Probleme im Tomcat - loading WebappClassLoader Allgemeines EE 3
O ApplicationServer vs. Tomcat Allgemeines EE 5
G Verbindung zu Tomcat Allgemeines EE 15
B Tomcat -> Funktions User Credentials hinterlegen Allgemeines EE 7
B fmt:setBundle => Wo liegt die Properties-Datei im Tomcat? Allgemeines EE 3
U Tomcat Compilierproblem Allgemeines EE 2
A Tomcat -- JSP: komisches Problem Allgemeines EE 11
W Speicher-Problem bei WebApp unter Tomcat, Struts, Hibernate Allgemeines EE 3
M Gelegentlicher Absturz Tomcat Anwendung: PermGen Space Allgemeines EE 6
R Error ServletContextListener auf Tomcat 6 Allgemeines EE 2
Y myFaces 1.2 und Tomcat 5.x / 6.0 Allgemeines EE 9
S tomcat session timeout - und was danach? Allgemeines EE 1
A Tomcat startet nicht, Einstellungsfehler? Allgemeines EE 3
S Auf Datei ausserhalb des Tomcat zugreifen Allgemeines EE 4
S JSP / Tomcat / Eclipse / Unable to compile class for JSP Allgemeines EE 4
E JBoss mit existierendem Tomcat nutzen? Allgemeines EE 4
M JSP: Tomcat: Serverfehler 500 nur beim IE. Allgemeines EE 2
G JSF 1.2 unter Netbeans 6 mit Tomcat 6.0 ->Navigationsprob Allgemeines EE 6
O eclipse - tomcat: Problem bei einfachem Webservice Allgemeines EE 16
L Tomcat Service mit JPDA debugging starten Allgemeines EE 2
J Tomcat: "Unable to get connection, DataSource invalid&q Allgemeines EE 8
A web.xml für Servlet in Tomcat 5.5 erstellen Allgemeines EE 2
F Tomcat: zentraler Class-Ordner? Allgemeines EE 2
A web.xml für Servlet in Tomcat erstellen Allgemeines EE 6
T Tomcat: JNDI + JDBC Problem Allgemeines EE 3
N Zugriff auf Webapp nur für localhost definieren (Tomcat) Allgemeines EE 2
byte Tomcat Deployment Problem (HTTP Status 503) Allgemeines EE 8
H Tomcat, MySQL Allgemeines EE 4
B tomcat verbergen Allgemeines EE 3
M classNotFoundexception vom tomcat Allgemeines EE 10
B Liferay + Tomcat Allgemeines EE 4
K tomcat: session-unabhängiges speichern Allgemeines EE 3
G Tomcat übersetzt nichts mehr Allgemeines EE 6
M tomcat beim booten mit starten Allgemeines EE 4
F Serverdienst in Tomcat implementieren Allgemeines EE 14
J Tomcat mit eigener Session-Implementierung Allgemeines EE 15
V tomcat 6 webserver oder was ist sein Sinn? Allgemeines EE 3
G eigener Tomcat-Connector f. propiet. Protokoll via TCP/IP Allgemeines EE 2
J wsdl-tomcat-AXIS Allgemeines EE 2
G Tomcat unter Eclipse starten Allgemeines EE 9
F Tomcat mit 128 MB Ram Allgemeines EE 9
C Unable to query Tomcat Manager: couldn't connect to host Allgemeines EE 2
A Cronjob mit Tomcat starten ? Allgemeines EE 4
B Connection Poll ohne TomCat Allgemeines EE 5
N Tomcat GWT-Anwendung - An beliebiger Stelle schreiben Allgemeines EE 2
E Tomcat Einstellungen Allgemeines EE 10
B Servlet-Api.jar auf JBoss? (Migration von Tomcat zu JBoss) Allgemeines EE 4
H Eine kurze Verständnisfrage zum Tomcat Allgemeines EE 2
S Hibernate, Tomcat und Eclipse treiben mich zum Wahnsinn. Allgemeines EE 2
F webanwendung läuft nicht auf Tomcat Allgemeines EE 2
M Tomcat, Hibernate, MySQL und die EOFException Allgemeines EE 7
Y Tomcat Thread-Handling Allgemeines EE 2
K Tomcat als Client nutzen Allgemeines EE 2
L Tomcat auf Windows Server 2003 Allgemeines EE 10
T Sysdeo Eclipse Tomcat Plug-in Allgemeines EE 4
H Tomcat in jbuilder mit startup.bat starten Allgemeines EE 5
P Tomcat Servlet POST Daten als Array Allgemeines EE 2

Ähnliche Java Themen

Neue Themen


Oben