Можно ли улучшить производительность ASP.NET с помощью модулей / статических классов? - PullRequest
1 голос
/ 16 декабря 2011

Может ли использование модулей или общих / статических ссылок на BLL / DAL улучшить производительность веб-сайта ASP.NET?

Я работаю над сайтом, состоящим из двух проектов, один - веб-сайт, другой - библиотека классов VB.NET, которая действует как комбинация DAL и BLL.

Библиотека используется для связи с базами данных, а иногда для преобразования / проверки данных, поступающих в / поступающих из БД.
В настоящее время каждая страница на сайте, которая нуждается в доступе к БД (подавляющее большинство), создаст экземпляр соответствующего класса в библиотеке для доступа к определенным таблицам.

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

Если бы я преобразовал классы в модули (разделяемый / статический класс), увеличилось бы быстродействие и была бы сохранена память, поскольку одновременно существует только один экземпляр каждого модуля и не нужно ли создавать новый экземпляр для каждого запроса?
(если так, кто-нибудь знает, может ли использование TableAdapters в качестве глобальных переменных в модулях вызвать проблемы из-за многопоточности?)

Или же ссылки на класс Library на странице ASP.NET будут иметь такой же эффект? (за исключением того, что мне пришлось бы переписывать намного меньше)

Ответы [ 3 ]

0 голосов
/ 16 декабря 2011

экземпляры являются проблемой, только если они не собраны CG (утечка памяти). Экземпляры также более гибкие, чем статические, поскольку вы можете настроить экземпляр в соответствии с используемым вами контекстом.

Когда приложение имеет низкую производительность или проблемы с памятью, обычно это признак того, что

  1. экземпляры не выпущены должным образом (IDisposable)
  2. объем полученных данных слишком велик (без разбивки на большие наборы данных)
  3. выполняется большое количество запросов (выберите n + 1 или просто много запросов)
  4. плохо построенные операторы SQL (отсутствующие индексы, FK, слишком много объединений и т. Д.)
  5. слишком много удаленных вызовов (либо на другие серверы, либо на диск)

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

0 голосов
/ 16 декабря 2011

Может ли использование модулей или общих / статических ссылок на BLL / DAL улучшить производительность веб-сайта ASP.NET?

Это возможно, но во многом зависит от того, как вы используетеданные.Единственный компромисс в использовании одного общего экземпляра объекта вместо одного на запрос состоит в том, что вам нужно будет применить блокировку, если только объекты не предназначены только для чтения, а блокировка может как замедлить процесс, так и усложнить ваш код (не говоря уже о том, чтообщий источник ошибок).

Однако, если каждый объект будет содержать одни и те же данные, то компромисс может стоить того - даже больше, если он может сохранить двустороннюю передачу БД.

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

0 голосов
/ 16 декабря 2011

Я не эксперт, но думаю, что отсутствие примеров этой статической объектной модели класса / сеанса в книгах и в Интернете свидетельствует о том, что плохая идея .

Iунаследовал приложение Linq-To-Sql, в котором контексты базы данных были статическими, и после n запросов все это просто разваливалось.Стандартной моделью для L2Sql является шаблон «Единица работы» (определите задачу или набор задач - выполните их и закройте).Позвольте платформе беспокоиться о пуле соединений и эффективном GC.

Вы просто пытаетесь быть эффективным или у вас проблемы с производительностью?Если последнее, как правило, более эффективно смотреть на кэширование или повышение эффективности запросов (использовать хранимые процедуры, вычеркивать запросы в циклах), чем смотреть на создание объектов.

Статика тоже плохо работает с юнит-тестами (еще одна причина, по которой они вышли из моды).

...