Когда я должен открыть и закрыть соединение с SQL Server
У меня есть простой статический класс с несколькими методами. Каждый из этих методов открывает SqlConnection, запрашивает базу данных и закрывает соединение. Таким образом, я уверен, что я всегда закрываю соединение с базой данных, но, с другой стороны, мне не нравится всегда открывать и закрывать соединение. Ниже приведен пример того, как выглядят мои методы.
public static void AddSomething(string something)
{
using (SqlConnection connection = new SqlConnection("..."))
{
connection.Open();
// ...
connection.Close();
}
}
Учитывая, что методы находятся внутри статического класса, должен ли я иметь статический член, содержащий единственный SqlConnection? Как и когда я должен его бросить? Каковы наилучшие методы?
Ответы
Ответ 1
Нет, не сохраняйте статический SqlConnection
, если вам не нужно. Threading будет одной проблемой, но что более важно - обычно вам просто не нужно. С вашим кодом, представленным, объединение внутренних соединений означает, что в большинстве случаев вы будете получать одно и то же базовое соединение при последовательных вызовах в любом случае (при условии, что вы используете одну и ту же строку соединения). Пусть пулемет выполняет свою работу; оставьте код в покое.
Это также позволяет избежать проблем, возникающих при запуске двух потоков... теперь каждый может работать над своим собственным подключением; со статическими (если вы не используете [ThreadStatic]
), вам придется синхронизировать, вводя задержки. Не говоря уже о повторном подключении (т.е. Один поток пытается использовать одно и то же соединение дважды в одно и то же время). Ага; Оставьте код в покое. Сейчас все в порядке, и почти любое изменение, которое вы сделаете, сделало бы его не очень хорошим.
Ответ 2
Поскольку SqlConnection имеет пул соединений при вызове Open() и Close(), вы фактически не открываете и не закрываете физическое соединение с сервером. Вы просто добавляете/удаляете соединение из пула доступных подключений. По этой причине лучше всего открыть соединение как можно позже и закрыть соединение как можно раньше после выполнения вашей команды.
Ответ 3
В вашем примере кода нет необходимости вызывать метод close() для объекта соединения, поскольку он будет обрабатываться автоматически из-за кода, находящегося внутри используемого блока.
Ответ 4
Большинство программистов считают, что рано или поздно рано открывать. Это только проблема, если задержка для открытия и закрытия соединения каждый раз приводит к замедлению всего приложения.
В вашем случае со статическим классом, вероятно, лучше всего открывать и закрывать соединение каждый раз.
Ответ 5
Вы делаете лучшие практики. Открывайте его прямо перед тем, как вы его запросите, и закройте его, как только сможете. Сначала это может показаться расточительным, но на самом деле это делает ваше приложение более масштабируемым в долгосрочной перспективе.
Ответ 6
Никогда не полагайтесь на соединение, чтобы закрыть его. Если он явно не закрыт, это приведет к проблемам с производительностью. Это случилось с нами в нашем проекте. Да, я знаю, что соединения управляются пулом соединений, но они все равно должны быть закрыты и возвращены в пул.