rubezh-TWnlenfritplesuk

Удержание соединения в EntityFramework

Как известно хорошим тоном является закрытие подключений к БД после использования, и EF придерживается этого правила: при каждом обращении он создает новое соединение, а затем, после обработки запроса - закрывает. Но что делать, если нужно обратиться к БД в рамках одного подключения? 

Для чего это нужно? Например, для оптимизации скорости работы, если есть необходимость выполнить десятки тысяч запросов на добавление/обновление информации, то накладные расходы на открытие/закрытие соединения, авторизацию сервером пользователя, осуществляющего подключение, и т.д. и т.п. будут весьма велики. Бывает, что нужно последовательно выполнить несколько запросов, которые создают временные таблицы, а затем из этих таблиц извлекают информацию, и ведь при закрытии соединения временные таблицы дропаются, и доступ к ним при следующем обращении уже не получим...

Разработчики EntityFramework это предусмотрели, но по умолчанию соединение возвращается в пулл соединений после каждой операции с БД.

Рассмотрим же как использовать одно соединение для выполнения нескольких операций:

using (MyContext context = new MyContext())
 {
    //Открываем постоянное подключение к БД
    context.Database.Connection.Open();
    foreach (var item in books)
    {
       if (context.Books.FirstOrDefault(u => u.ISBN == item.ISBN) == null)
       {
          var book = AutoMapper.Mapper.Map(item);
          context.Books.Add(book);
          context.SaveChanges();
          //На этом этапе подключение остается в состоянии Open (см. изображение ниже)
       }
    }
 } // После освобождения рессурсов, соединение будет закрыто

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

В режиме отладки можно посмотреть соединение, с применением команды Database.Connection.Open(), оно будет поддерживаться в открытом состоянии:

Connection is still OpenЕсли закомментировать строку с Database.Connection.Open(), то при каждой итерации цикла подключение будет открываться и закрываться. Посмотрим на его состояние в ходе выполнения цикла: 

Connection is Closed

Собственно все. Но не забывайте, держать соединение открытым без весской причины плохо - экономим рессурсы сервера, делимся с братьями :)

1 1 1 1 1 1 1 1 1 1 Рейтинг 90%

Метки: SQL, Entity Framework, CSHARP

Печать E-mail

Добавить комментарий


Защитный код
Обновить