Почему нам нужно создавать, открывать и закрывать соединения БД для получения нескольких наборов результатов, но не для получения одного набора? - PullRequest
0 голосов
/ 17 января 2019

Чтобы извлечь различные наборы результатов, возвращаемых хранимой процедурой, мы должны использовать это:

                    UsersPhonesDBContext.Database.Initialize(force: false);
                    DbConnection con = UsersPhonesDBContext.Database.Connection;    

                    var cmd = con.CreateCommand();
                    cmd.CommandText = "[dbo].[SelectPhones]";

                    con.Open();

                    var reader = cmd.ExecuteReader();

                    Phones phones = ((IObjectContextAdapter)UsersPhonesDBContext)
                        .ObjectContext
                        .Translate<Phones>(reader, "Phones", MergeOption.AppendOnly).First();

                    reader.NextResult();

                    Users users = ((IObjectContextAdapter)UsersPhonesDBContext)
                       .ObjectContext
                       .Translate<Users>(reader, "Users", MergeOption.AppendOnly).First();

Но если процедура возвращает один набор результатов, то мы можем просто сделать это с помощью

var phones1 = UsersPhonesDBContext.Database.SqlQuery<Phones>("dbo.InsertPhones @model", sqlParam);

без создания, открытия и закрытия соединения с БД и т. Д.

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

1 Ответ

0 голосов
/ 18 января 2019

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

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

В приведенном вами примере несколько операций с базами данных происходят водин ход.Таким образом, вместо открытия соединения индивидуально для каждой операции, открывается только одно соединение, и оно закрывается после выполнения операции.Здесь соединение открывается и закрывается вручную.

Новые подходы DataAccess Layers, такие как EntityFramework и т. Д., Выполняют эту работу внутренне.

UsersPhonesDBContext.Database.SqlQuery<Phones>("dbo.InsertPhones @model", sqlParam);

В этой строке кодаСоединение с базой данных открывается и закрывается внутри, и мы не беспокоимся об этом.

Поэтому основной мотив - минимизировать операции открытия и закрытия соединения и закрыть соединение, как только цель его открытия закончится.

...