Singleton Lebenszeit? (vs Servlet Context) ?

Hallo

ich möchte bei einer Web-Anwendung auf Basis von Servlets die Clientrequests „mitloggen“ und nach einer gewissen Zeit aber auch wieder löschen z.B. jede Woche. DAs ganze sollte „in Memory“ Passieren da wenige Anfragen und wegen ein paar weiteren ANforderungen. (das ganze ist auch nur exemplarisch also nicht kritisieren weil ich das nicht in einre DB oder sonst wie mache)

Meine Frage was ist hier effektiver ist. Eine Hashtable in den Servlet/Web-App-Context zu speichern die die ForeignHosts als Key benutzt sowie eine zusätzlich Variable welche die letzte Reset-ZEit speichert (timestamp) __oder___ das ganze in ein Singleton zu packen. Anzumerken für die obere Variante ist, dsas man die ganzen Zugriffe natürlich synchronisieren muss.

Ein singleton würde mir wesentlich besser gefallen, da es später auch unabhängig von der Web-Anwendung genutzt werden kann. ABer mir ist aus Unwissenheit:wink: nicht klar, wie lange der Lebenszyklus eines Singleton ist.
(Es dürfte somit nur ein einziges mal instanziert werde und bis zur Ende der VM bzw. der Anwendung laufen!! Tut es das wirklich?)

Beim ersten Zugriff darauf wird mittels einer statischen getInstance() Methode die Instanz in einer statischen Klassenvariable gespeichert. Heisst das, dass egal ob ich danach auch wieder sämtliche Referenzen auf dieses Singletoninstanz „nulle“, die Instanz dennoch weiterexistiert, bis die VM gestoppt wird (sprich niemals garbagecollected wird.) =Es existiert ja noch die interne Referenz der Singletoninstanz in der statischen klassenvariablen. Somit existiert ständig eine Referenz auf dieses Singleton.

Andererseits könnte ja auch die VM so intelligent sein und merken, dass das eine rein „zirkuläre“ Referenz ist, die nicht von „aussen“ referensiert wird und somit das Singleton für die garbage collection freigeben.
(Als Ausweg wäre hier, die Singletoninstanz im Webabb/Servlet-Context zu speichern…)

Wer kann mir das erklären oder Infos dazu geben was da konkret geschieht und wie der Lebenzyklus einer Singleton-Instanz aussieht.

vielen Dank
Julian

Hi,

also ich bin mir nicht 100%ig sicher, aber ich denke mal, dass es doch gar keine Möglichkeit gibt sich Daten zu merken, die Servlet-übergreifend sind. Diese müssten ja in dem Servlet-Container gesichert werden, und das so was geht, wäre mir neu; aber ich kann mich auch irren.

Die Lebenszeit einer Singleton-Instanz ist genauso wie die einer normalen Instanz. Das Entwurfsmuster Singleton sagt ja nur, dass genau eine einzige Instanz der Singleton-Klasse erzeugt werden darf (privater Konstruktor und statische public getInstance()-Methode).

Ben

Hi,

also ich bin mir nicht 100%ig sicher, aber ich denke mal, dass
es doch gar keine Möglichkeit gibt sich Daten zu merken, die
Servlet-übergreifend sind. Diese müssten ja in dem
Servlet-Container gesichert werden, und das so was geht, wäre
mir neu; aber ich kann mich auch irren.

Dazu gibt es den Application-Scope, in dem Attribute abgelegt werden können. Allerdings muß man hier vorsichtig sein: Der Speicher ist schnell vollgemüllt und das JRE hat die unangenehme Eigenschaft, einmal reservierten Speicher nicht mehr herzugeben.

Dh. im einfachsten Falle kannst du in der Variable application, welche dir in JSPs afaik sogar zur Verfügung gestellt wird, einfach einen Vector anlegen, in dem du deine Loggings verstaust.

mfG,

J.P.Jarolim