Singleton-Objekte und Java-servlets
Wenn ich Zugriff auf ein singleton Java-Objekt aus innerhalb eines servlet, das Objekt ist nur "single" oder "eine Instanz" für das give-servlet-thread oder einzelne in der gesamten JVM auf dem Server-Betriebssystem (wie Linux)?
Ich meine, wenn der client eine Verbindung zum servlet/service, sind singleton-Objekt sind einzigartig für jeden thread für jeden client oder seine einzigartig in der gesamten JVM installiert in der Maschine?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke das Objekt ist einzigartig für jeden Benutzer nicht die ganze JVM. Die einzige persistente Informationen, die Sie setzen in der user-session.
Ich bin mir nicht sicher, aber ich denke, man kann acomplish, um eine Instanz einer Klasse in der gesamten Applikation Server mit den ClassLoader-Klasse, aber ich don wissen, wie es gemacht wird.
UPDATE:
Entnommen aus dem Java-Artikel "Wenn ein Singleton nicht ein Singleton?"
Mehrere Singletons Gleichzeitig Geladen durch Unterschiedliche Class Loader
Bei der zwei-Klassen-Lader laden einer Klasse, Sie haben tatsächlich zwei Kopien der Klasse, und jeder kann seine eigene Singleton-Instanz. Dies ist insbesondere relevant in servlets laufen in bestimmten servlet-engines (iPlanet zum Beispiel), wo jedes servlet standardmäßig verwendet seinen eigenen class loader. Zwei verschiedene servlets Zugriff auf eine gemeinsame Singleton, in der Tat, erhalten Sie zwei verschiedene Objekte.
Mehrere class loader auftreten, häufiger als Sie vielleicht denken. Als die Browser laden von Klassen aus dem Netzwerk für die Verwendung von applets, benutzen Sie einen separaten class-loader für jede server-Adresse. Ähnlich, Jini und RMI-Systeme können ein separates class-loader für die unterschiedlichen code-Basen aus, die Sie herunterladen class-Dateien. Wenn Sie Ihr eigenes system verwendet eine benutzerdefinierte class loader, die alle die gleichen Probleme, die entstehen können.
Wenn geladen, die durch unterschiedliche class loader, zwei Klassen mit dem gleichen Namen, sogar den selben package-Namen, werden so behandelt, wie verschiedene-auch wenn in der Tat, Sie sind byte-für-byte der gleichen Klasse. Die unterschiedliche class loader repräsentieren unterschiedliche namespaces, die Klassen unterscheiden (auch wenn die Klassen-Namen sind identisch), so dass die beiden MySingleton Klassen sind in der Tat Verschieden. (Siehe "Class Loader als Namespace-Mechanismus" in Ressourcen.) Seit zwei Singleton-Objekte gehören zu zwei Klassen mit dem gleichen Namen, erscheint es auf den ersten Blick, dass es zwei Singleton-Objekte der gleichen Klasse.
Ich würde sagen, es hängt davon ab, wie das singleton implementiert ist, aber alle Anforderungen für eine bestimmte app auszuführen in der gleichen VM, so sollte es sein, eine Instanz für alle Anfragen.
EDIT: Das ist unter der Annahme einer geradlinig-Singleton-Implementierung ähnlich:
Ja, es ist
Singleton
. Aber der Umfang des singleton hängt davon ab, wo sich die Klasse befindet.Wenn Sie sich innerhalb der Anwendung, es ist singleton für die Anwendung. Wenn Sie die gleiche Klasse vorhanden ist, die innerhalb einer anderen Anwendung dann ein anderes Objekt erstellt wird, für diese Anwendung, und es ist singleton für die Anwendung.
Wenn es sich außerhalb der Anwendung und den server, es ist singleton für die VM.
Beim erstellen einer Singleton-Instanz, die alle request-Instanzen teilen sich die gleiche Instanz für den aktuellen class-loader verwendet.
Da alle
Servlets
laufen auf einem webserver läuft auf einem einzigenJVM
ist, es wird nur eine einzigeSingelton
Objekt für alle servlets.