asp.net-mvc - 存储库连接池

标签 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);
}

现在,如果在我的 Controller 操作中调用 _contractsControlRepository.ListContractCostCentres(2) 之后立即调用另一个存储库,它是否使用相同的连接?什么时候在 Controller 中打开连接?什么时候关门?

干杯

编辑

我正在使用 Steve Sanderson 建议的手写 LINQ在他的 ASP.NET MVC book .

编辑编辑

澄清一下,我使用 LINQ 作为我的 ORM,但我使用原始 SQL 查询(如上面的摘录所示)进行查询。例如,这是一个 Controller 操作:

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 在我的 Controller 中实例化并像 _contractsControlRepository.ListContractCostCentres(2) 一样使用。连接不是手动打开的,DataContext 会为我处理。

最佳答案

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

没有读过相关的书,我不知道“手动 linq”到底是什么。如果它是手动的,则意味着您要自己取回表格,那么显然您正在打开/关闭连接。当最终执行语句时,Linq to SQL 将使用新的连接对象,此时连接池开始发挥作用——这意味着新的连接对象可能不是实际的新连接。

关于asp.net-mvc - 存储库连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1398214/

相关文章:

asp.net-mvc - ActionLink 删除确认

c# - DefaultModelBinder 和继承对象的集合

c# - SignalR 中的内存使用情况会重新启动 ASP.NET Web 应用程序

java - 如何管理自定义数据库连接池

java - JAVA 中的 SSL 套接字连接池

java - 如何改进这个连接池设计?

.net - ASP.NET MVC Html.ActionLink 结果 URL - 编码方式

jQuery 工具 : How to prevent a submit event from a form that is rendered dynamically into a page

java - 从 ThreadSafeClientConnManager 连接池取消/中止连接

c# - 如何在异常发生之前检测到导致异常的条件?