我和老板在一起,因为在我有一些突出问题的证据之前,我不能转向使用新技术。其中一个主要问题是存储库如何处理连接。所谓的最大开销之一是连接和断开数据库。如果我有一个存储库,我会执行以下操作:
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会为我处理。
答案 0 :(得分:2)
在不知道ORM的详细信息以及它如何连接SQL数据库驱动程序的情况下将连接池。当连接关闭时,它将被释放回池中并保持打开X秒(其中X是可配置的)。如果打开另一个连接并且所有参数都匹配(服务器名称,应用程序名称,数据库名称,身份验证详细信息等),则池中的任何空闲但打开的连接都将被重用,而不是打开全新的连接。
没看过这本书,我不知道“手册linq”到底是什么。如果它是手动的意味着你自己拿回桌子那么显然你正在打开/关闭连接。当最终执行语句时,Linq to SQL将使用新的连接对象,此时连接池将起作用 - 这意味着新的连接对象可能不是实际的新连接。