我和我的老板大吵了一架,因为在我有一些悬而未决的问题的证据之前,我不能转向使用更新的技术。主要关注点之一是存储库如何处理连接。据称最大的开销之一是与数据库的连接和断开连接。如果我有一个存储库,我可以执行以下操作:
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/