Zarządzanie sesją NHibernate?

Po pierwsze, pozwólcie, że podam krótki opis scenariusza. Piszę prostą grę, w której prawie cała praca jest wykonywana po stronie serwera za pomocą cienkiego klienta dla graczy, którzy mają do niej dostęp. Gracz loguje się lub tworzy konto, a następnie może wchodzić w interakcję z grą, poruszając się po siatce. Kiedy wejdą do celi, powinni zostać poinformowani o innych graczach w tej komórce i podobnie, inni gracze w tej komórce zostaną poinformowani o wejściu tego gracza. Istnieje wiele innych interakcji i działań, które mogą mieć miejsce, ale nie warto ich szczegółowo opisywać, ponieważ jest to więcej tego samego. Kiedy gracz wylogowuje się, a następnie wraca lub serwer przestaje działać i powraca, cały stan gry powinien się utrzymywać, chociaż jeśli serwer ulegnie awarii, nie ma znaczenia, czy stracę 10 minut czy więcej zmian.

Zdecydowałem się użyć NHibernate i bazy danych SQLite, więc dużo czytałem na temat NHibernate, po samouczkach i pisaniu kilku przykładowych aplikacji, i jestem całkowicie zdezorientowany, jak powinienem to zrobić!

Mam pytanie: jaki jest najlepszy sposób zarządzania sesjami? Właśnie z małej kwoty, którą rozumiem, wszystkie te możliwości wyskakują na mnie:

Miej jedną sesję, która jest zawsze otwarta, z której korzystają wszyscy klienciMiej jedną sesję dla każdego klienta, który łączy się i okresowo go opróżniaOtwórz sesję za każdym razem, gdy muszę użyć któregokolwiek z utrwalonych obiektów i zamknij ją, gdy tylko aktualizacja, wstawienie, usunięcie lub zapytanie zostaną zakończoneMiej sesję dla każdego klienta, ale odłącz ją i podłącz ponownie tylko wtedy, gdy muszę z niej skorzystaćTak jak powyżej, ale utrzymuj połączenie i odłącz go dopiero po pewnym okresie bezczynnościTrzymaj jednostki odłączone i dołączaj je co 10 minut, powiedzmy, aby zatwierdzić zmiany

Jakiej strategii powinienem użyć, aby uzyskać przyzwoitą wydajność, biorąc pod uwagę, że może być wiele aktualizacji, wstawek, usunięć i zapytań na sekundę od setek klientów jednocześnie, a wszyscy oni muszą być ze sobą spójni?

Kolejne mniejsze pytanie: w jaki sposób efektywnie korzystać z transakcji? Czy dobrze jest, aby każda pojedyncza zmiana była we własnej transakcji, czy też będzie źle, gdy setki klientów próbują zmienić komórki w sieci? Czy powinienem spróbować dowiedzieć się, jak połączyć podobne aktualizacje i umieścić je w ramach jednej transakcji, czy też będzie to zbyt skomplikowane? Czy w większości przypadków potrzebuję nawet transakcji?

questionAnswers(4)

yourAnswerToTheQuestion