Подтвердить что ты не робот

Когда я должен открыть и закрыть соединение с SQL Server

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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