存储库连接池

时间:2009-09-09 08:04:39

标签: asp.net-mvc connection-pooling

我和老板在一起,因为在我有一些突出问题的证据之前,我不能转向使用新技术。其中一个主要问题是存储库如何处理连接。所谓的最大开销之一是连接和断开数据库。如果我有一个存储库,我会执行以下操作:

public ContractsControlRepository()
  : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }

这样的课程如下:

public class ContractsControlRepository : DataContext, IContractsControlRepository

具有以下功能:

public IEnumerable<COContractCostCentre> ListContractCostCentres(int contractID)
{
    string query = "SELECT C.ContractID, C.CCCode, MAC.CostCentre, C.Percentage FROM tblCC_Contract_CC C JOIN tblMA_CostCentre MAC ON MAC.CCCode = C.CCCode WHERE C.ContractID = {0}";
    return this.ExecuteQuery<COContractCostCentre>(query, contractID);
}

现在,如果在我的控制器操作中调用_contractsControlRepository.ListContractCostCentres(2)后立即再次调用存储库,它是否使用相同的连接?什么时候在控制器中打开连接?什么时候关闭?

干杯

修改

我正在使用Steve Sanderson ASP.NET MVC book中{{3}}建议的手写LINQ。

编辑编辑

为了澄清,我使用LINQ作为我的ORM,但我正在使用原始SQL查询(如上面的摘录中所示)进行查询。例如,这是一个控制器动作:

public ActionResult EditBusiness(string id)
{
   Business business = _contractsControlRepository.FetchBusinessByID(id);
   return View(business);
}

我没有打开/关闭连接。

这是我的回购的更大,更完整的摘录:

public class ContractsControlRepository : DataContext, IContractsControlRepository
  {
    public ContractsControlRepository()
      : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }


public IEnumerable<COContractCostCentre> ListContractCostCentres(int contractID)
{
  string query = "SELECT C.ContractID, C.CCCode, MAC.CostCentre, C.Percentage FROM tblCC_Contract_CC C JOIN tblMA_CostCentre MAC ON MAC.CCCode = C.CCCode WHERE C.ContractID = {0}";
  return this.ExecuteQuery<COContractCostCentre>(query, contractID);
}

然后在我的控制器中实例化ContractsControlRepository并像_contractsControlRepository.ListContractCostCentres(2)一样使用。连接不是手动打开的,DataContext会为我处理。

1 个答案:

答案 0 :(得分:2)

在不知道ORM的详细信息以及它如何连接SQL数据库驱动程序的情况下将连接池。当连接关闭时,它将被释放回池中并保持打开X秒(其中X是可配置的)。如果打开另一个连接并且所有参数都匹配(服务器名称,应用程序名称,数据库名称,身份验证详细信息等),则池中的任何空闲但打开的连接都将被重用,而不是打开全新的连接。

没看过这本书,我不知道“手册linq”到底是什么。如果它是手动的意味着你自己拿回桌子那么显然你正在打开/关闭连接。当最终执行语句时,Linq to SQL将使用新的连接对象,此时连接池将起作用 - 这意味着新的连接对象可能不是实际的新连接。