Во-первых, позвольте мне дать краткое описание сценария. Я пишу простую игру, в которой почти вся работа выполняется на стороне сервера с тонким клиентом для доступа игроков. Игрок входит в систему или создает учетную запись, а затем может взаимодействовать с игрой, перемещаясь по сетке. Когда они входят в ячейку, они должны быть проинформированы о других игроках в этой ячейке, и аналогично, другие игроки в этой ячейке будут проинформированы о том, что этот игрок входит в нее. Есть много других взаимодействий и действий, которые могут иметь место, но не стоит вдаваться в подробности о них, поскольку это просто больше того же самого. Когда игрок выходит из системы, а затем снова входит в систему или если сервер выключается и возвращается в рабочее состояние, все игровое состояние должно сохраняться, хотя в случае сбоя сервера не имеет значения, потерял ли я около 10 минут изменений.
Я решил использовать NHibernate и базу данных SQLite, поэтому я много читал о NHibernate, следуя учебным пособиям и написание некоторых примеров приложений, и я полностью сбит с толку относительно того, как мне следует поступить об этом! *
У меня есть вопрос: как лучше всего управлять своими сессиями? Только из небольшого количества, которое я понимаю, все эти возможности выскакивают у меня:
- Один сеанс, который всегда открыт, который используют все клиенты
- Иметь один сеанс для каждого клиента, который подключается и периодически очищать его
- Открывайте сеанс каждый раз, когда мне нужно использовать какие-либо из сохраняемых сущностей, и закрывайте его, как только обновление, вставка, удаление или запрос завершаются
- Создайте сеанс для каждого клиента, но оставляйте его отключенным и подключайте его только тогда, когда мне нужно его использовать
- То же, что и выше, но оставляйте его подключенным и отключайте его только после определенного периода бездействия
- Держите сущности отделенными и присоединяйте их только каждые 10 минут, скажем, чтобы зафиксировать изменения
Какую стратегию я должен использовать для достижения достойной производительности, учитывая, что может быть много обновлений, вставок, удалений и запросов в секунду от, возможно, сотен клиентов одновременно, и все они должны быть согласованы друг с другом?
Еще один небольшой вопрос: как мне эффективно использовать транзакции? Это нормально для каждого отдельного изменения в его собственной транзакции, или это будет работать плохо, когда сотни клиентов пытаются изменить ячейки в сетке? Должен ли я попытаться выяснить, как объединить похожие обновления и поместить их в одну транзакцию, или это будет слишком сложно? Мне даже нужны транзакции для большей части?