2009-11-09 4 views
0

Я пишу веб-сайт (C#, ASP 3.5) при реализации простой CMS. В нескольких ограниченных местах - я разрешаю администратору сайта управлять содержимым страницы.ASPX CMS - проблемы с производительностью

Редактирование содержимого осуществляется с помощью элемента управления Edit - выходной HTML хранится в базе данных (SqlServer Express).

Каждый раз, когда загружается страница - я читаю HTML-содержимое страницы из базы данных и печатаю ее на экране.

На данный момент (этап разработки) все работает нормально и плавно.

Но, я немного боюсь проблем с производительностью в реальном мире (слишком много вызовов db?).

Я ищу оптимальное решение для кэширования динамических HTML-страниц: Предполагая, что содержание страницы НЕ будет обновлять часто, я должен:

  • Держите решение, как это сделано сегодня - вызов для БД динамическое содержимое страницы на каждой загрузке страницы (если IsPostBack)
  • Хранить содержимое страницы в файле и читать ее с диска
  • Храните содержимое страницы в переменных приложения.
  • Другая идея?

Я предполагаю, что содержание страницы, то есть текст HTML - не слишком длинный.

Благодаря

ответ

0

Я не хочу, чтобы оставить отрицательный ответ или не дает ответ, но, прежде чем делать что-либо или с учетом кэширования, вы должны решить/работать, если это проблема производительности. Если вы читаете что-либо от людей, которые активно участвуют в работе (Рико Мариани и его блог - хороший пример), то вы увидите один из способов, которым это достигается посредством измерения.

Сколько хитов вы ожидаете в час или минуту? Как долго вызов БД происходит на производственном сервере?

Существует несколько способов выяснить это, простой профайлер кода (.NET custom class - message me if you want details) можно использовать для каждого запроса и выводить его в файл журнала. Время, необходимое для вызова базы данных, также может быть выведено из системы. Это может дать вам представление о производительности для одного запроса (при условии, что промежуточное оборудование/среда очень похоже на производственную среду). Чтобы протестировать его под нагрузкой, вы можете использовать инструмент стресс-тестов и имитировать ожидаемую нагрузку. Это должно указывать вам среднее время обслуживания запросов в секунду. Если это приемлемо, вы можете не требовать никакого кэширования вообще. Много времени кэширование может быть принято до того, как это необходимо. Добавление кода для использования функций кэширования корпоративной библиотеки без лишнего увеличения сложности вашего кода. Кэширование вывода также может вводить тонкие проблемы, но в этой ситуации я бы согласился с ответом, который предлагает это как жизнеспособное решение.

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

+0

В таком случае, когда для получения текстов CMS на странице будет только один или два вызова базы данных, я согласен с тем, что использование механизма кэширования не обязательно. – Ranch

0

Я бы реализовать стратегию кэширования, тот, который не предполагает дискового ввода/вывода. Например, вы можете скачать Enterprise Library и сделать что-то вроде:

ICacheManager cacheManager = CacheFactory.GetCacheManager(); 
object obj = cacheManager.GetData(YOUROWNCACHEKEY);

YourCMSContentType cmsContent = null;
if (obj == null) { cmsContent = ""; //get cms content from db here cacheManager.Add(YOUROWNCACHEKEY, cmsContent); } else { cmsContent = obj as YourCMSContentType; }
return cmsContent;

Вы должны ссылаться:

  • Microsoft.Practices.EnterpriseLibrary.Caching

Они должны быть также доступны на сервере:

  • Microsoft.Practices.EnterpriseLibrary.Common.dll
  • Microsoft.Practices.ObjectBuilder2.dll
  • Microsoft.Practices.Unity.dll

Корректировать app.config или web.config, щелкните правой кнопкой мыши, щелкните «Редактировать конфигурацию корпоративной библиотеки», щелкните правой кнопкой мыши узел .config, добавьте блок кэширования приложений.

С уважением,

М.

0

Используйте атрибут OutputCache на ваших страницах.

OutputCache on MSDN

Супер легко сделать, у него в кэше, скажем 60 минут, а затем будет только максимум 24 ДБ вызовов на одной странице в день.

Смотреть это: How to use Output Cache video

Смежные вопросы