ASP.Net Постоянные объекты - PullRequest
1 голос
/ 22 декабря 2009

Я создаю сайт ASP.Net. У меня есть класс "корзина", который хранит товары в корзине пользователей. Я не хочу повторно запрашивать базу данных каждый раз, когда страница перезагружается, чтобы заполнить элементы корзины, хранящиеся в этом объекте. Является ли лучший способ сохранить / сохранить экземпляры объектов, поместив их в сеанс и сохранить сеанс в базе данных (мы находимся на SQL Server 2k8)? Похоже, это то, что большинство рекомендуют читать другие посты в StackOverflow. Наш сайт имеет довольно большой объем трафика, поэтому легко представить, что тысячи таких объектов активны в любой момент времени.

Я новичок в создании сайтов ASP.Net. Является ли обычной практикой сохранение пользовательских объектов (не только простых переменных в сеансе или файле cookie, но и объектов класса) ... также в соответствии с принципами постоянных объектов, я планирую создать статический класс, в котором будут храниться часто используемые данные всего сайта, такие как как список штатов США ... есть ли подводные камни с этим? Я не хочу стрелять себе в ногу.

Обновление:

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

Ответы [ 5 ]

2 голосов
/ 22 декабря 2009

Сессия, вероятно, ваш лучший вариант.

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

Просто убедитесь, что ваш класс Cart является "сериализуемым", в противном случае он перестанет переходить на Session.

2 голосов
/ 22 декабря 2009

Возможно, вы захотите рассмотреть новую технологию Microsoft, которую они называют AppFabric. Он содержит функцию распределенного кэша (ранее известную как Velocity). Проблема с сохранением вашего состояния сеанса в SQL, конечно, заключается в том, что вы обращаетесь к базе данных каждый раз, когда получаете доступ к своему состоянию сеанса. Конечно, проблема с использованием объекта Session заключается в том, что он доступен только для того конкретного сервера, который выходит из строя, если вы находитесь в фермерской среде. Velocity предоставляет распределенный кэш (который также способен довольно легко работать с данными сеанса ASP.NET), который представляет собой кэш в памяти, распределенный по некоторому количеству компьютеров и к которому все ваши серверы имеют доступ.

1 голос
/ 23 декабря 2009

Поскольку вы сказали, что не хотите запрашивать БД при каждой загрузке страницы, состояние сеанса будет плохим выбором - поскольку это именно то, что он делает (при условии, что вы используете режим SQL, поскольку режим InProc выиграл не работает на веб-ферме). Фактически, как правило, для каждого запроса есть два обхода в БД: один в начале, чтобы прочитать объект сеанса и обновить время истечения сеанса, и другой в конце, чтобы обновить его. Сеансы также налагают блокировки на ваши страницы, пока они активны, что может быть проблемой для сайтов, использующих Ajax или фреймы, или когда пользователи часто используют несколько окон.

В целом, вы будете намного лучше с точки зрения производительности и масштабируемости, если будете сами хранить объекты в SQL Server. При таком подходе вы можете делать такие вещи, как кеширование объектов, используя SqlDependency или SqlCacheDependency, чтобы избежать обходов. В веб-ферме также часто используется cookie-файлы, чтобы обеспечить синхронизацию всего, поскольку возможна небольшая задержка с момента обновления БД до момента очистки записей кэша на всех серверах посредством уведомлений.

Если это поможет, я подробно расскажу о следующих типах проблем в своей книге: Сверхбыстрый ASP.NET .

0 голосов
/ 23 декабря 2009

Можете ли вы использовать липкие сессии (сходство) на своей веб-ферме и вставлять вещи в сессию?

http://msdn.microsoft.com/en-us/magazine/cc163844.aspx

0 голосов
/ 23 декабря 2009

Это может быть случай преждевременной оптимизации.

На мой взгляд, сложно создать качественный веб-сайт, если вы разрабатываете его с использованием состояния сеанса. HTTP является «не сохраняющим состояние», и хотя существуют абстракции, предназначенные для маскировки этого факта (например, сессия ASP.NET), вам часто приходится сталкиваться с правдой. Объект Session является хорошим инструментом для кэширования в памяти, но вы никогда не должны полагаться на его надежность. Другими словами, вы можете использовать его для оптимизации кода, но вам все равно всегда будет нужен код для полного восстановления базы данных в качестве запасного варианта.

Хранение Session в SQL - это способ попытаться обойти проблемы фермы серверов, но зачем беспокоиться, если вы пытаетесь вообще избежать базы данных? Имейте в виду, что, хотя вы можете повторять запросы для одних и тех же данных корзины покупок между запросами, сам SQL-сервер может выполнить большую часть кеширования и оптимизации для вас. Это может быть не так медленно, как вы думаете.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...