Даже если оно статическое, никогда не использует одно соединение - во-первых, я не верю, что соединение является поточно-ориентированным, поэтому оно не обязательно будет любезновызывается параллельно из двух разных клиентов.
Даже если я ошибаюсь в этом (и если это так, я все равно не буду разделять одно соединение между несколькими потоками), но если что-то случится с сервером базы данныхскажем, он перезапускается, или сама служба (из-за обновления, выпущенного вашей группой поддержки), затем соединение будет разорвано, и у вас не будет возможности открыть его снова - необходимо перезапустить службу / приложение.Скорее всего, в следующий раз, когда вы попытаетесь что-то с ним сделать, это действительно вызовет исключение.
Кроме того, где вы располагаете соединением?Очень трудно избавиться от статического объекта, если вы не выполняете работу, чтобы подключиться к событию выключения, которое не всегда надежно.Полагаться на закрытие AppDomain, чтобы распоряжаться чем-то для вас, просто не очень хорошая практика.
Создайте соединение, когда вам это нужно, и избавьтесь от него, когда закончите с ним.Основываясь на коде, который вы дали, в самых простых терминах:
using(var conn = new DbConn().Connection)
{
SqlCommand command = conn.CreateCommand();
/* query and get results here */
}
Хотя в действительности вы можете захотеть сделать вас DbConn
классом IDisposable
и приковать цепочку к базовому Connection
'* Dispose
метод в реализации IDisposable.Dispose
- таким образом вы можете сделать
using(var dbconn = new DbConn())
{
//now you can use dbconn.Connection knowing that it will be disposed of
}
Примечание - блок using
все равно будет работать, если new DbConn()
будет заменен заводским методом или свойством get - itпросто гарантирует, что Dispose()
вызывается для объекта при выходе из блока, и даже если возникает исключение.
Делая это, вы обойдете все проблемы, которые я выделил в первой половине моего ответа.