Репозиторий Petapoco приводит к серьезным проблемам с производительностью

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

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

Я провел пару тестов.

Страница, на которой он находится (это страница aspx), загружается примерно за 1,2 секунды, как на данный момент. Страница выполняет около 30 запросов к базе данных... и, глядя на профилировщик, выполняет вход и выход из системы для каждого запроса (даже с пулом соединений).

Если я сохраняю соединение и не закрываюсь до тех пор, пока страница не закончится, это уменьшится примерно до 70 мс, что является довольно значительной экономией.

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

Я создал тестовое приложение, чтобы продемонстрировать это.

Это демонстрирует, что загрузка пользователя 1000 раз занимает 230 мс, если репозиторий используется повторно, и 3,5 секунды, если репозиторий создается заново каждый раз.


person Paul    schedule 10.12.2014    source источник


Ответы (2)


Использование вами пула соединений нарушает лучшие практики.

После каждого утверждения нигде не сказано, как от него избавиться. Обычно я сохраняю соединение/репозиторий во время обработки и закрываю его только тогда, когда моя функция завершена (с MVC).

Да, даже у пула соединений есть накладные расходы, и вы, кажется, действительно обязаны делать это шоу.

person TomTom    schedule 10.12.2014
comment
Хорошо, лучшие практики для этого кажутся очень неясными — многие разработчики делают много разных вещей. Вы открываете это соединение в начале метода представления, а затем просто передаете его всем, что вам нужно сделать? - person Paul; 10.12.2014
comment
msdn.microsoft.com/en-us/magazine/cc163854.aspx# S4, по-видимому, предлагает открывать и закрывать соединение по мере необходимости... если только я не истолковал это неправильно - person Paul; 10.12.2014
comment
да. Как и когда вам нужно. Начать обработку страницы, требовать подключения, ПОКА Я НЕ БОЛЬШЕ. Это не говорит о каждом отдельном операторе SQL. Обычно я открываю репозиторий, когда он мне нужен, и держу его открытым до тех пор, пока он мне больше не понадобится (обычно это конец функции, отображающей страницу). - person TomTom; 10.12.2014

Что я всегда делаю, так это создаю один экземпляр моего репозитория для каждого запроса. Поскольку я разрабатываю почти исключительно с использованием шаблона MVC, это означает, что я создаю переменную уровня закрытого класса в каждом из моих контроллеров и использую ее для обслуживания любых запросов в моих методах Action. В переводе на WebForms (ASPX) это означает, что я бы создал его в BeforeLoad (или любом другом событии непосредственно перед PageLoad) и передал бы его по мере необходимости. Я не думаю, что сохранение экземпляра на уровне класса является хорошей идеей для веб-форм, но я не могу вспомнить достаточно, чтобы быть уверенным.

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

Помните: информация в Интернете бесплатна, и вы получаете то, за что платите.

person Captain Kenpachi    schedule 10.12.2014