2009-09-09 2 views
2

나는 현저한 문제가있을 때까지 최신 기술을 사용하는 것으로 전환 할 수 없기 때문에 사장님과 함께 하하하하고 있습니다. 주요 관심사 중 하나는 리포지토리가 연결을 처리하는 방법입니다. 가장 큰 오버 헤드 중 하나는 데이터베이스에 연결하거나 데이터베이스와의 연결을 끊는 것입니다. 내 컨트롤러 액션에 _contractsControlRepository.ListContractCostCentres(2)라고하면 이제저장소 연결 풀링

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

: 같은 기능을

public class ContractsControlRepository : DataContext, IContractsControlRepository 

: 그래서 같은 클래스

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

: 나는 다음을 수행 저장소가있는 경우 즉시 저장소에 대한 또 다른 호출이 이어지며 동일한 연결을 사용합니까? 컨트롤러에서 언제 연결이 열립니까? 언제 닫습니까? 그의 ASP.NET MVC bookSteve Sanderson에 의해 제안 내가 손으로 쓴 LINQ를 사용하고

건배

편집 할 수 있습니다.

편집 편집

내가 내 ORM로 LINQ를 사용하고, 명확히하기 위해,하지만 (위의 추출물에서와 같이) 나는 쿼리에 대한 원시 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) :

여기 내 REPO의 더 큰, 더 완전한 추출물입니다. 연결은 수동으로 열리지 않으며, DataContext는 그 연결을 처리합니다.

+0

저장소 코드를 생성하는 데 사용하는 항목에 따라 다릅니다. 그렇다면 어떤 ORM 소프트웨어를 사용하고 있습니까? – blowdart

+0

@ Kezzer- 그 책을 가지고 있고 Steve는 그의 LINQ to SQL 모델에서 끌어서 놓기와 반대되는 특성을 사용하지만 책에서 인라인 SQL을 사용하는 곳은 어디에도 없습니다. 이 책에서 쿼리는 LINQ를 사용하여 작성됩니다. – RichardOD

+0

나는 알고 있지만 우리 시스템의 요구 사항은 LINQ to SQL을 사용하여 SQL 쿼리를 생성하지 않는 것입니다.LINQ to SQL을 ORM 도구로 사용하고 쿼리를위한 인라인 쿼리를 사용합니다. 사장님이 그렇게 말씀 하시니까요. 나는 그것에 동의하지 않는다, 나는 그에게 LINQ to SQL 쿼리가 직접적인 SQL 쿼리보다 느리지 않다는 것을 증명할 때까지는 선택의 여지가 없다. – Kezzer

답변

2

ORM의 세부 사항을 알지 못하고 SQL 데이터베이스 드라이버를 연결하는 방법은 연결 풀입니다. 연결이 닫히면 풀로 다시 해제되고 X 초 동안 열립니다 (X는 구성 가능). 다른 연결이 열려 있고 모든 매개 변수 (서버 이름, 응용 프로그램 이름, 데이터베이스 이름, 인증 정보 등)가 일치하면 풀에있는 무료이지만 열려있는 모든 연결이 새로운 연결을 여는 대신 재사용됩니다.

문제의 책을 읽지 않고 "수동 linq"이 실제로 무엇인지 알 수 없습니다. 그것이 수동이라면 테이블을 스스로 다시 얻는다는 것을 의미하며 분명히 연결을 열고 닫는 것입니다. Linq to SQL은 연결 풀링이 실행되는 명령문이 실행될 때 새로운 연결 개체를 사용합니다. 즉, 새로운 연결 개체가 실제로 새로운 연결이 아닐 수도 있습니다.

+0

RichardOD와 내 편집에 대한 내 의견을 확인하십시오. 난 그냥 정규 SQL 있지만 LINQ 모델링을 사용하고 있습니다. – Kezzer

+0

나는 "설명서"를 가장 가벼운 의미로 말합니다. 기본적으로 필자는 모델링에 LINQ를 사용하고 있으며 SQL 쿼리를 통해 데이터를 다시 쿼리합니다. 나는 LINQ를 SQL에 사용하지 않고 있는데, 사용하지 않는 구문을 따르기 때문입니다. 내 ORM 도구는 LING이며, 내 쿼리 도구는 원시 SQL 쿼리와 함께 DataContext를 사용합니다. 나는 연결을 열거 나 닫지 않을 것이다. – Kezzer

+0

그 때 나의 대답은 서있다. – blowdart