Каков наилучший способ управления переменными сеанса? - PullRequest
1 голос
/ 25 марта 2010

В моем веб-приложении .NET я храню базовую информацию о пользователе в объекте сеанса пользователя. Я также обычно держу класс директора в сессии; который в основном просто имеет информацию о том, над чем он работает на этом экране (например, идентификатор клиента).

Я пытаюсь не добавлять кучу сессий. Я также хочу убедиться, что в любой момент времени только те сессии, которые необходимы, находятся в памяти.

Это означает, что мне нужен эффективный способ управления переменными сеанса. Какие-либо предложения?

Ответы [ 6 ]

1 голос
/ 25 марта 2010

Две вещи:

1 - Вы не должны хранить столько данных в сеансе, что управление памятью является проблемой . То есть, не храните объекты в сеансе, храните указатели на вещи, например, а не экземпляр User, просто сохраняйте UserID. Если вам нужно, вы можете добавить кеширование для извлечения информации, но это должно быть на уровне кеширования отдельно от сессий.

2 - Используйте сеансы базы данных , чтобы не беспокоиться о памяти сервера и чтобы при желании можно было легко добавить больше веб-серверов (примечание: StateServer дает вам это способность, а также). Кроме того, это позволяет перезапускать пул приложений без потери сеанса пользователями. Это основная причина, по которой я это делаю, - она ​​позволяет мне развернуться на лету.

Причиной столь деликатного подхода к сеансам является то, что они остаются после последнего запроса пользователя, обычно в течение 10–20 минут. Таким образом, запросы из разных сеансов могут занимать большие объемы памяти сервера, если вы храните большие объекты в сеансе. Выполнение даже более сумасшедших вещей, таких как хранение соединений с базой данных в сеансе, может привести к тому, что вы израсходуете все доступные соединения с базой данных, просто потому, что многие остаются в памяти в ожидании окончания сеанса.

В идеале "управление" сеансами не требуется.

0 голосов
/ 25 марта 2010

Мое предложение:

  • Обернуть доступ к сеансу в интерфейс IPerSessionCache
  • Разработать конкретную реализацию этого интерфейса
  • Использовать конкретный классв коде для получения / установки данных сеанса
  • Таким образом, у вас есть свобода для очистки экземпляра IPerSessionCache по окончании сеанса
  • Код не должен знать, где находится IPerSessionCacheфактически хранит данные (т. е. они могут храниться в сеансе, в базе данных, в файле cookie и т. д.)
  • Вы бы лучше контролировали время жизни IPerSessionCache, особенно если вы используете контейнер DI для управления исоздание экземпляра

HTH.

0 голосов
/ 25 марта 2010

Что я обычно делаю, это только сохраняю идентификатор объекта в Session и сохраняю данные в слое кэширования перед базой данных. Таким образом, вы сохраняете свою сессию довольно маленькой, но большинство данных все равно можно эффективно извлечь, если элемент находится в кеше. Обычно это хорошо работает для меня.

0 голосов
/ 25 марта 2010

Нет правильного ответа. Это зависит от количества одновременно работающих пользователей, от объема вашей памяти. Хранить вещи в сеансе быстрее, чем в базе данных, если у вас есть переменные сессии в proc Я обычно стараюсь хранить только то, что, как мне известно, может понадобиться пользователю во время выполнения конкретной задачи, или, как вы сказали, информацию о текущем пользователе.

0 голосов
/ 25 марта 2010

Я думаю, что вы неправильно понимаете сессии в ASP.NET. Вы не управляете ими явно (хотя вы могли бы, вы бы редко этого хотели), они неявно создаются и уничтожаются ASP.NET и IIS. Каждому пользователю предоставляется сеанс.

Теперь все, что вы храните в сеансе пользователя, хранится в памяти на сервере, поэтому, если вы регулярно размещаете большие объекты в сеансах каждого пользователя, это приведет к быстрому росту памяти, что приведет к проблемам производительности и масштабируемости.

Единственные данные, которые вам нужно сохранить в сеансе, - это временные данные, которые вы хотите, чтобы они были доступны для разных запросов страниц, которые вы хотите защитить, чтобы они не были доступны клиенту в файле cookie или аналогичной конструкции.

Однако читать то, что вы делаете, скорее всего, не нужно. Поскольку вы работаете с определенной страницей и функциями «директора», это, скорее всего, будет целесообразно разместить на странице в состоянии просмотра в качестве промежуточного хранилища данных.

0 голосов
/ 25 марта 2010

Мое предложение: не используйте переменные сеанса. Храните все в базе данных.

...