Кажется логичным, что я объявил бы соединение уровня класса и инициализировал бы его в конструкторе веб-сервиса.
Нет, это не кажется логичным. ADO.NET использует пул соединений , поэтому вам не нужно этого делать. Этот пул соединений для каждой строки соединения для домена приложения.
Таким образом, вы можете просто нарисовать новое соединение из пула в каждом веб-методе и вернуть его в пул в конце (операторы using
позаботятся об этом):
[WebMethod]
public void Foo()
{
// Here you are NOT creating a new connection to the database
// you are just drawing one from the connection pool
using (var conn = new SqlConnection(SomeConnectionString))
using (var cmd = conn.CreateCommand())
{
// Here you are NOT opening a new connection to the database
conn.Open();
cmd.CommandText = "SELECT id FROM foo";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// do something with the results
}
}
} // Here you are NOT closing the connection, you are just returning it to the pool
}
Итак, вот совет: не пытайтесь управлять соединениями вручную, используя некоторые поля классов, статические поля, ... Оставьте это управление ADO.NET, так как оно лучше.
Примечание: код, который я показал, обычно находится на уровне доступа к данным, который вызывается веб-методом.