Накладные расходы на создание нового SqlConnection в c # - PullRequest
5 голосов
/ 07 января 2010

Некоторое время назад я написал слой ORM для моего приложения .net, где все строки базы данных представлены подклассом DatabaseRecord. Существует ряд методов, таких как Load(), Save() и т. Д. В своей первоначальной реализации я создал соединение с БД в конструкторе DatabaseRecord, например,

connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString
);

Затем я вызываю Open() и Close() для этого SqlConnection в начале и в конце моих методов, которые обращаются к базе данных. Мне (как человеку, знакомому с программированием, но незнакомому с c # и .net) это показалось наиболее эффективным способом выполнения действий - иметь одно соединение и открывать / закрывать его, где это необходимо в классе.

Я только что читал, и кажется, что этот шаблон рекомендуется в нескольких местах:

using (var connection = new SqlConnection(...)) {
    connection.Open();
    // Stuff with the connection
    connection.Close();
}

Я понимаю, почему это желательно - соединение устанавливается автоматически Dispose() d, даже если то, что вы делаете посередине, вызывает неперехваченное исключение. Мне было просто интересно, что такое издержки для вызова new SqlConnection() потенциально много раз, как это.

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

Ответы [ 3 ]

8 голосов
/ 07 января 2010

Да, это лучшая практика. using делает ваш вызов Close () безопасным от исключений.

И издержки на создание (любого) объекта действительно минимальны и наименьшие для недолговечных объектов (которые остаются в поколении GC 0).

Обратите внимание, что вам больше не нужно вызывать Close () в конце блока using, это делается автоматически для вас (Dispose == Close).

1 голос
/ 07 января 2010

Если вы не уверены в стоимости открытия / закрытия соединения, используйте SqlConnection переменную-член вашего класса, но сделайте класс IDisposable и избавьтесь от SqlConnection, когда класс будет удален

1 голос
/ 07 января 2010

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

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

Кроме того, вы должны заметить, что метод Dispose закроет соединение для вас. Так что нет необходимости звонить как Close, так и Dispose. Так как предложение using вызовет dispose, когда оно закончится, обычно нет необходимости вызывать Close.

...