Наверху создания нового SqlConnection в c#

Некоторое время назад я записал уровень ORM для своего приложения .NET, где все строки базы данных представлены подклассом DatabaseRecord. Существует много методов как Load(), Save() и т.д. В моем начальном внедрении я создал соединение с DB в конструкторе 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() потенциально много раз как это.

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

5
задан vitch 7 January 2010 в 11:48
поделиться

3 ответа

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

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

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

.
8
ответ дан 13 December 2019 в 22:09
поделиться

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

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

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

.
1
ответ дан 13 December 2019 в 22:09
поделиться

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

.
1
ответ дан 13 December 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: