Sitzungsverwaltung im Ruhezustand?

Lassen Sie mich zunächst eine kurze Beschreibung des Szenarios geben. Ich schreibe ein einfaches Spiel, in dem die meiste Arbeit auf der Serverseite mit einem Thin Client erledigt wird, auf den die Spieler zugreifen können. Ein Spieler meldet sich an oder erstellt ein Konto und kann dann mit dem Spiel interagieren, indem er sich in einem Raster bewegt. Wenn sie eine Zelle betreten, sollten sie über andere Spieler in dieser Zelle informiert werden, und in ähnlicher Weise werden andere Spieler in dieser Zelle über diesen Spieler informiert, der sie betritt. Es gibt viele andere Interaktionen und Aktionen, die stattfinden können, aber es lohnt sich nicht, auf Details einzugehen, da es nur mehr dasselbe ist. Wenn sich ein Spieler ausloggt und wieder einloggt oder wenn der Server ausfällt und wieder hochfährt, sollte der gesamte Spielstatus bestehen bleiben. Wenn der Server abstürzt, spielt es keine Rolle, ob ich etwa 10 Minuten an Änderungen verliere.

Ich habe mich für NHibernate und eine SQLite-Datenbank entschieden, deshalb habe ich viel über NHibernate gelesen, habe Tutorials gelesen und einige Beispielanwendungen geschrieben und bin sehr verwirrt darüber, wie ich vorgehen soll!

Die Frage, die ich habe, lautet: Wie kann ich meine Sitzungen am besten verwalten? Gerade aus der kleinen Menge, die ich verstehe, springen mir all diese Möglichkeiten heraus:

Haben Sie eine einzige Sitzung, die immer geöffnet ist und von allen Clients verwendet wirdFühren Sie für jeden Client, der eine Verbindung herstellt, eine einzelne Sitzung durch, und leeren Sie sie regelmäßigÖffnen Sie eine Sitzung jedes Mal, wenn ich eine der persistierten Entitäten verwenden muss, und schließen Sie sie, sobald das Aktualisieren, Einfügen, Löschen oder Abfragen abgeschlossen istFühren Sie für jeden Client eine Sitzung durch, lassen Sie diese jedoch getrennt, und stellen Sie die Verbindung erst wieder her, wenn ich sie verwenden mussWie oben, aber halten Sie die Verbindung aufrecht und trennen Sie die Verbindung erst nach einer gewissen Zeit der InaktivitätHalten Sie die Entitäten getrennt und hängen Sie sie beispielsweise alle 10 Minuten an, um die Änderungen zu übernehmen

Welche Strategie sollte ich anwenden, um eine anständige Leistung zu erzielen, da möglicherweise Hunderte von Clients gleichzeitig viele Aktualisierungen, Einfügungen, Löschungen und Abfragen durchführen und alle miteinander konsistent sein müssen?

Noch eine kleinere Frage: Wie soll ich Transaktionen effizient nutzen? Ist es in Ordnung, wenn sich jede einzelne Änderung in einer eigenen Transaktion befindet, oder funktioniert das schlecht, wenn Hunderte von Clients versuchen, Zellen im Raster zu ändern? Sollte ich versuchen, herauszufinden, wie ähnliche Aktualisierungen zusammengefasst und in eine einzelne Transaktion eingefügt werden können, oder ist das zu kompliziert? Benötige ich überhaupt Transaktionen für das meiste?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage