Когда следует открывать и закрывать соединение с SQL Server - PullRequest
37 голосов
/ 14 мая 2009

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

public static void AddSomething(string something)
{
    using (SqlConnection connection = new SqlConnection("..."))
    {
        connection.Open();
        // ...
        connection.Close();
    }
}

Учитывая, что методы находятся внутри статического класса, должен ли я иметь статический член, содержащий один SqlConnection? Как и когда я должен бросить это? Каковы лучшие практики?

Ответы [ 6 ]

45 голосов
/ 14 мая 2009

Нет, не храните статический SqlConnection, если нет необходимости. Потоки были бы одной проблемой, но что более важно - обычно вам просто не нужно. С вашим представленным кодом пул внутренних соединений означает, что большую часть времени вы будете получать одно и то же базовое соединение при последующих вызовах (если вы используете одну и ту же строку соединения). Пусть пулер сделает свою работу; оставьте код в покое.

Это также позволяет избежать проблем, возникающих, когда вы начинаете работать с двумя потоками ... теперь каждый из них может работать со своим собственным соединением; со статическим (при условии, что вы не используете [ThreadStatic]) вам придется синхронизироваться, что приводит к задержкам. Не говоря уже о повторном входе (то есть один поток пытается использовать одно и то же соединение дважды в одно и то же время). Ага; оставьте код в покое. Теперь все в порядке, и почти любое изменение, которое вы сделаете, сделает его нехорошим.

19 голосов
/ 14 мая 2009

Поскольку у SqlConnection есть пул соединений, когда вы вызываете Open () и Close (), вы фактически не открываете и не закрываете физическое соединение с сервером. Вы просто добавляете / удаляете соединение из пула доступных соединений. По этой причине рекомендуется установить соединение как можно позже и закрыть соединение как можно раньше после выполнения команды.

5 голосов
/ 14 мая 2009

В вашем примере кода нет необходимости вызывать метод close () для объекта подключения, поскольку он будет обрабатываться автоматически из-за кода, находящегося внутри блока using.

3 голосов
/ 14 мая 2009

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

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

1 голос
/ 14 мая 2009

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

0 голосов
/ 30 апреля 2010

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

...