2014-01-30 3 views
0

с использованием EntityFramework 5 (POCO), SQL2012, ASP.NET-MVC4.Производительность запросов для чтения веб-приложений Asp.Net

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

Допустим, у нас есть два разных запроса: один работает медленно (до минуты), еще один довольно быстрый 1,2 сек. Даже на тестовом сервере, когда есть только один пользователь, и это я, если я открываю два разных окна браузера (разделяя один и тот же сеанс) и сначала выполняю длинный запрос, а затем быстрый запрос в одно и то же время и когда я запрашиваю запуск сеансов на сервере sql для активных я вижу только один сеанс, и в результате быстрый запрос также застрял в ожидании медленного запроса. Я пробовал пару вещей и получил случайные результаты: Я отключил объединение строк соединений;

Pooling=False; 

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

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

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

Мы используем MSDTC, чтобы все транзакции выполнялись в контексте транзакции, и это оставляет все открытые соединения в настройке Serializable, в результате нам приходилось запускать запросы на чтение также в области транзакций и выбрали уровень Read Uncommitted изоляции в этом.

Таким образом, имея вполне работоспособный SQL-сервер, как я могу предотвратить использование ASP.Net/ADO.Net/EF5 соединения, которое все еще имеет запрос, запущенный на сервере.

PS: Я создаю экземпляр DbContext, передавая строку соединения конструктору DbContexts. Запрашиваемые запросы находятся в двух разных контекстах.

ответ

0

это, похоже, устраняет проблему.

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
public class SomeController: Controller 

Если установить состояние сеанса чтения, Asp.Net MVC позволяет иметь несколько запросов, выполняющихся в то же время.

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