2014-12-10 1 views
0

우리는 petapoco 저장소 패턴 (blog post과 유사)을 사용하고 있습니다. 페이지가로드되면 리포지토리가 열리고 쿼리가 실행되고 처리가 끝난 다음 처리가 수행됩니다. 밝은 페이지에서는 괜찮습니다. 그러나 페이지에서 몇 번 발생하면 성능이 크게 저하됩니다.Petapoco 저장소 패턴 중요한 성능 문제

필자는 잘못해서 연결 풀링을 사용할 수 있다고 가정 했었습니다.

몇 가지 테스트를 실시했습니다.

현재 페이지를로드하는 데 (aspx 페이지) 약 1.2 초가 걸립니다. 이 페이지는 약 30 개의 데이터베이스 쿼리를 실행 중입니다 ... 그리고 프로파일 러를 보면 연결 풀링을 사용하는 경우에도 쿼리 당 로그인 및 로그 아웃을 수행하고 있습니다.

연결을 유지하고 페이지가 끝날 때까지 닫지 않으면이 값이 약 70ms로 떨어지며 상당히 절약됩니다.

아마도 우리는 요청에 대해 데이터베이스 객체를 계속 묶어야하지만 PetaPoco가 이러한 오버 헤드를 많이 가지고 있다고 생각하지 않았습니다 ... 특히 연결 풀링이 많습니다.

설명하기 위해 test app을 만들었습니다.

이는 사용자를 1000 번로드하면 저장소를 다시 사용할 경우 230ms가 걸리고 저장소가 매번 다시 작성되는 경우 3.5 초가 소요됨을 보여줍니다.

답변

0

연결 풀링을 사용하는 것이 모범 사례를 위반하는 것입니다.

그것은 모든 진술 후에 그것을 없애는 데 아무 곳에도 말하지 않습니다. 나는 일반적으로 처리하는 동안 연결/저장소를 유지하고 내 함수가 끝나면 (MVC 사용) 닫을뿐입니다.

예, 연결 풀이 오버 헤드를 가지고 있으며 실제로 그 쇼를 만드는 데 바운드처럼 보입니다.

+0

좋아, 잘 모범 사례는 매우 명확하지 않은 것처럼 보입니다. 많은 개발자가 여러 가지 일을합니다. 뷰 메소드의 시작 부분에서이 연결을 연 다음 필요한 작업을 수행하는 중입니까? – Paul

+0

http://msdn.microsoft.com/en-us/magazine/cc163854.aspx#S4는 내가 필요로 할 때 연결을 열고 닫을 것을 제안하는 것으로 보입니다.이 단어를 잘못 해석하지 않은 한, 예 : – Paul

+0

예. 언제 어디서나 필요합니다. 처리 페이지 시작, 내가 필요하지 않을 때까지 연결이 필요합니다. "모든 단일 SQL 문에 대해"라고는하지 않습니다. 일반적으로 저장소가 필요할 때 열어서 더 이상 필요하지 않을 때까지 열어 둔다 (보통 페이지를 렌더링하는 함수의 끝이다). – TomTom

0

항상하는 일은 요청 당 하나의 저장소 인스턴스를 만드는 것입니다. MVC 패턴을 거의 독점적으로 개발했기 때문에 각 컨트롤러에 개인 클래스 수준의 변수를 만들고이를 사용하여 Action 메서드 내에서 모든 요청을 처리합니다. WebForms (ASPX)로 번역됨에 따라 BeforeLoad (또는 PageLoad 직전의 이벤트)에서 하나를 만들고 필요에 따라 전달합니다. 클래스 레벨 인스턴스를 유지하는 것이 Webforms에 좋은 아이디어라고 생각하지 않지만 확신 할만큼 충분히 기억할 수는 없습니다.

일반적으로 페이지로드 또는 Ajax 호출 인 요청 전체에 대해 repo (또는 다른 유형의 클래스) 인스턴스 하나를 사용하는 것이 일반적입니다. 그리고 당신이 지적한 이유들 때문에.

기억하십시오 : 인터넷상의 정보는 무료이며 귀하가 지불 한 금액을받습니다.