2017-02-02 6 views
4

Мы работаем над проектом с использованием ASP.NET MVC4. На одном из собраний команды вышла идея использования Сессия за запрос образец.Как это работает в шаблоне Session Per Request?

Я сделал небольшой поиск и выяснил некоторые вопросы здесь, в SO, говоря - в общем, что этот шаблон (если его можно назвать) указывает на рамки ORM.

Небольшого пример

//GET Controller/Test 

public ActionResult Test() 
{ 
    //open database connection 

    var model = new TestViewModel 
       { 
         Clients = _clientService.GetClients(), 
         Products = _productService.GetProducts() 
       }; 

    //close database connection 
    return View(model); 
} 

Без сессии на просьбу:

//GET Controller/Test 

public ActionResult Test() 
{ 
    var model = new TestViewModel 
       { 
         Clients = _clientService.GetClients(), // Open and close database connection 
         Products = _productService.GetProducts() // Open and close database connection. 
       }; 
    return View(model); 
} 

Сомнение

  1. Чтобы контекстуализировать, как работает сеанс на запрос?
  2. Это хорошее решение?
  3. Каков наилучший способ его реализации? Открыть соединение в Интернете?
  4. Рекомендуется ли в проектах со сложными запросами/операциями?
  5. Есть ли возможность дать проблему параллелизма при совершении транзакций?
+0

Сессия по запросу, на каком уровне точно? Является ли клиент для веб-сервера, веб-сервера для сервера приложений или сервера приложений сервером базы данных/базы данных? Нам нужна дополнительная информация, чтобы давать советы. – DDan

+0

Веб-приложение к базе данных. –

+0

Если вы выполняете трассировку того, что выполняется в базе данных в каждом случае, вы увидите разницу. – gpersell

ответ

6

Похоже, вы имеете в виду «контекст БД для каждого запроса». Вы можете достичь этого с помощью Единицы работы.

Простая реализация, что вы можете проверить ИНТ этой статье Radu Pascal: https://www.codeproject.com/Articles/243914/Entity-Framework-context-per-request

другой реализации (для Entity Framework и NHibernate), вы можете найти в ASP.NET шаблонный, который является более сложным: http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work

1

В Интернете (веб-приложение, wcf, asp.net web api) рекомендуется использовать один контекст БД для каждого запроса. Зачем? Поскольку запросы недолговечны, по крайней мере, это идея, или ваше приложение будет иметь медленное время отклика, поэтому нет смысла создавать много контекстов db.

Например, если вы используете EF как ORM и вы отправляете запрос на метод Find, EF сначала будет искать все, что вы запрашиваете, в локальном кэше контекста db. Если он будет найден, он просто вернет его. Если не найден, он перейдет в базу данных и вытащит его и сохранит в кеше. Это может быть очень полезно в сценариях, где вы запрашиваете одни и те же элементы несколько раз, пока ваше веб-приложение не выполнит запрос. Если вы создаете контекст, запрашиваете что-то, закрываете контекст, тогда есть вероятность, что вы сделаете много поездок в базу данных, которых можно было бы избежать.

Чтобы подробнее остановиться, представьте, что вы создаете много новых записей: запись клиента, запись заказа, затем выполните некоторую работу, а затем, основываясь на каких-либо критериях, которые вы создаете для диска со скидкой, затем некоторые другие записи, а затем некоторые orderitem records. Если вы используете подход Single Context Per-Request, вы можете продолжать добавлять их и вызывать SaveChanges в конце. EF будет делать это в одной транзакции: либо все они преуспеют, либо все откат. Это здорово, потому что вы получаете транзакционное поведение, даже не создавая транзакций.Если вы сделаете это без подхода Single Context Per-Request, то вам нужно самому позаботиться о таких вещах. Это не означает, что в подходе Single все должно быть в одной транзакции: вы можете вызывать SaveChanges столько раз, сколько хотите в рамках одного и того же запроса HTTP. Рассмотрите другие возможности, когда вы вытаскиваете запись, а затем решили отредактировать запись, а затем отредактируйте ее еще несколько: снова в подходе Single все будет применено к одному и тому же объекту, а затем сохранено в один снимок.

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