1

使用 ado.net 时,我应该担心打开和关闭太多连接吗?

例如,假设我有一个 MVC 控制器方法,它调用 3 个单独的存储库来填充所有需要的对象。

 public ActionResult()
 {
      var codesRepository = new CodesRepository();
      viewModel.codes = codesRepository.GetCodesByName("D");

      var employeeRepository = new EmployeeRepository();
      viewModel.employees = employeeRepository.GetByName("Thomas");

      var companyRepository = new CompanyRepository();
      viewModel.company = companyRepository.GetById(20);

      //.... rest of code
 }

在上面的每个 GetBy 方法中,我打开和关闭一个连接。

using(var connection = DbFactory.GetConnection('SQLBase') 
{
    // code to fill the objects.
}

我是否需要担心这种方法是我正在为每个调用的方法打开和处理连接?在我看来,应该为所有 3 使用相同的连接?

我读过一些关于连接池的文章。这是特定于数据库的功能,还是 ado.net 中的功能?

4

2 回答 2

1

是的,你应该——主要是因为你的设计是一种反模式。虽然对读取的性能影响很小,但您完全破坏了事务完整性或写入/更新方面的性能。

要点是 - 为了跨多个存储库进行更新,那么您需要 DTC(慢),或者逐个存储库,它没有事务完整性。

对于交叉引用实体的任何选择操作,哟也非常慢。而且你是维护的噩梦。

companyRepository.GetById(20);

应该

repository.Element<Company>.Where (x => x.id=20);

这种方法将允许您:

  • 对所有内容使用一个存储库。
  • 灵活使用公司,包括连接操作和子选择
  • 对没有 DTC 的事务中的所有更新使用一个存储库和一个连接。

现在你的问题不是开放,而是更新和交易。

这是实体框架等使用的方法 - 如果您想要性能,原始,您可以使用 BlToolkit。

于 2012-12-10T04:30:24.180 回答
-1

ADO.NET 自动使用连接池,因此您不必担心它。

因此,如果您打开到数据库的多个连接,它将通过将连接池化到一个连接来优化连接。

基本上你不必担心它:)

于 2012-12-10T04:04:15.173 回答