2009-05-16 4 views
2

Ich verwende ein TWebModule mit Apache. Wenn ich das richtig verstanden habe, wird Apache eine weitere Instanz meines TWebModule-Objekts erzeugen, wenn alle zuvor erstellten Objekte mit der Verarbeitung von Anfragen beschäftigt sind. Ist das richtig?Session Management in TWebModule

Ich habe mein eigenes SessionObject erstellt und eine TStringList erstellt, um sie zu speichern. Die StringList wird im Initialisierungsabschnitt am Ende meiner Quellcodedatei erstellt, die das TWebModule-Objekt enthält. Ich finde die Initialisierung kann mehrfach aufgerufen werden (vermutlich wenn Apache einen anderen Prozess erzeugen muss).

Gibt es eine Möglichkeit, eine globale "Sessions" TStringlist für alle meine Sitzungsobjekte zu haben? Oder ist die "sichere" Methode, Sitzungsinformationen in einer Datenbank zu speichern und sie auf Basis eines Cookies für jede Anfrage abzurufen?

Der Grund, warum ich dies möchte, ist den Datenbankzugriff zu reduzieren und stattdessen Sitzungsinformationen im Speicher zu halten.

Danke.

Antwort

2

Wie Stijn vorgeschlagen, ist die Verwendung eines separaten Speichers, um die Sitzungsdaten wirklich zu halten, der beste Weg zu gehen. Noch besser ist es, wenn Sie versuchen, Ihre Anwendung so zu schreiben, dass der Webbrowser den Status enthält, der dem Design innewohnt. Dies wird die Fähigkeit, Ihre Anwendung in die Tausende oder Zehntausende von gleichzeitigen Benutzern mit viel weniger Hardware skalieren erheblich erhöhen.

Intraweb ist eine großartige Option, leidet aber unter dem Skalierungsproblem in dem Sinne, dass mehr gleichzeitige Benutzer, sogar IDLE-Benutzer, mehr Hardware benötigen, um zu unterstützen. Es ist viel besser, von Anfang an eine Methode des Servers zu entwerfen, die so intern wie möglich läuft. Natürlich, wenn Sie eine feste Anzahl von Benutzern haben und kein Wachstum erwarten, dann ist dies weniger ein Problem.

1

Das ist seltsam. Wenn Initialisierungsabschnitte mehr als einmal aufgerufen werden, liegt das möglicherweise daran, dass die DLL in separaten Prozessbereichen geladen wird. Eine Option, die ich mir ausdenken kann, ist zu überprüfen, ob das Objekt "Sessions" bereits existiert, wenn Sie es bei der Initialisierung erstellen. Wenn die DLL wirklich in separaten Prozessen geladen wird, hilft das nicht, und dann schlage ich vor, einen zentralen Session-Speicherprozess zu schreiben und Inter-Prozess-Kommunikation aus Ihrem TWebModule zu verwenden (es gibt einige Methoden: Nachrichten, Named Pipes, COM). ..)

+0

Sorry für den späten Kommentar; Ich dachte, ich hätte die Benachrichtigungsbox überprüft, aber nicht. Ja, ich muss davon ausgehen, dass die DLL wieder geladen wird. Fürs Erste benutze ich nur die Backend-Datenbank für das Session Management. –

0

Intraweb im Anwendungsmodus behandelt wirklich Session-Management und Datenbankzugriff sehr reibungslos und skaliert gut. I've commented on it previously. Während dies nicht direkt die Frage beantwortet, die Sie gestellt haben, hat Intraweb die Probleme für mich gelöst, als ich die gleichen Probleme hatte.