Правильное использование SqlConnection в .NET - PullRequest
0 голосов
/ 15 января 2011

Мне просто нужно мнение о правильном использовании или правильном дизайне в отношении использования объекта SqlConnection. Какой из 2 ниже является лучшим использованием:

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

IList<Employee> GetAllEmployees() 
{ 
  using (SqlConnection connection = new SqlConnection(this.connectionString)) { 
  // Code goes here... 
  } 
} 

Employee GetEmployee(int id) 
{ 
  using (SqlConnection connection = new SqlConnection(this.connectionString)) { 
  // Code goes here... 
  } 
}   

или

SqlConnection connection; // initialized in constructor 
IList<Employee> GetAllEmployees() 
{ 
  this.TryOpenConnection(); // tries to open member SqlConnection instance 
  // Code goes here... 
  this.CloseConnection(); 
  // return 
} 

Employee GetEmployee(int id) 
{ 
  this.TryOpenConnection(); // tries to open member SqlConnection instance 
  // Code goes here... 
  this.CloseConnection(); 
  // return 
}

Или есть лучший подход, чем этот? У меня есть целевое приложение типа веб-сканера, и это приложение будет сканировать 50 или более веб-сайтов одновременно (многопоточно), причем каждый веб-сайт содержится в объекте-сканере, и у каждого объекта-сканера есть экземпляр класса поставщика данных (см. Выше).

Ответы [ 2 ]

5 голосов
/ 15 января 2011

Фактические соединения с базой данных будут объединены. Пока все ваши SqlConnection экземпляры используют одну и ту же строку подключения, они все будут использовать одно и то же соединение.

Я считаю, что это чище для создания экземпляра соединения, использования, а затем утилизации (в блоке using). Таким образом, если код необходимо изменить, чтобы использовать другую строку подключения, использовать транзакцию или что-то еще, у вас есть все, что нужно, чтобы сделать изменение доступным прямо здесь.

0 голосов
/ 15 января 2011

Может быть, не совсем связано, но единственный раз, когда я отделяю какой-либо объект соединения от уровня экземпляра класса, это когда я хочу создать четкое разделение интересов каждого метода ... Возможно, это слишком долго и нужно должны быть реорганизованы на несколько частей, и каждый из них должен работать в том же соединении, что и часть транзакции.

* 1003 Т.е. *

Create a connection
Start transaction
Call a subroutine to update an order header (passing along the connection or get it from the instance)
Call a subroutine to update all order details (passing along the conneciton or get it from the instance)
End transaction
Close connection

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

...