2012-08-11 3 views
1

ORM으로 Entity Framework를 사용하는 ASP.NET MVC 응용 프로그램이 있습니다. 이제는 PerWebRequest 라이프 스타일 EF ObjectContext을 사용하고 있습니다.Windsor의 PerWebRequest 라이프 스타일과 풀 라이프 스타일 통합

로드가 많은 상황에서 응용 프로그램 성능을 프로파일 링하는 동안 ObjectContext 생성에 병목 현상이 있음을 발견했습니다.

나는을 풀링 ObjectContext를의 라이프 스타일을 변경하려면,하지만 문제가있다.

내 응용 프로그램의 레거시 부분에는 서비스 검색 자 안티 패턴이 있습니다. 따라서 ObjectContext는 웹 요청마다 여러 번 해결 될 수 있으며 사용 후에 명시 적으로 릴리스되지 않습니다. ObjectContext는 예를 한 번 인스턴스화 대해 EndRequest 이벤트를 보장 방출하기 때문에

PerWebRequest
으로 그것은 문제가 아니다. 라이프 스타일에 다른 ObjectContext는 예를 풀링 기본

해결 메서드 호출에 대해 반환 될 것이다. 하지만 웹 요청 범위에서 단일 인스턴스를 다시 사용하고 싶습니다. 또한 (예 : PerWebRequestLifestyleModule) 요청이 끝날 때 인스턴스가 자동으로 풀 (풀로 복귀)되기를 원합니다.

은 내가 정의 LifestyleManager 또는 윈저에 대한 사용자 정의 IPool을 구현해야한다고, 날 것으로 보인다. 하지만 결합 방법을 모르겠다. Windsor에서의 경험 부족으로 PerWebRequest의 라이프 스타일이 있습니다.

나에게 아이디어를 줄 수 있습니까? 감사합니다. .

UPD : ObjectContext는의 상태와 이유에 대한 성능 이유는

가 다시 사용할 수 있습니다. ObjectContext의 생성은 꽤 비쌉니다. 나는 그것을 피할 방법을 찾고 있습니다. 나는 ObjectContext는의 상태 본질을 다루는 두 가지 방법이 있고 그것을 재사용 :

  • 사용 상태 비 문맥을 (ChangeTracking을 끄고) 쿼리. 명령의 경우 다른 인스턴스를 사용하십시오.
  • 풀로 돌아갈 때 컨텍스트의 상태를 재설정합니다. 귀하의 경우에는

답변

3

에게 도착 보장, 현재 스레드에 연결 할 수있는 라이프 스타일을 변경할 수 있습니다. 요청간에 (그리고 잠재적으로 사용자간에) 공유 상태가 유출됩니다. ObjectContext 클래스는 재사용하도록 설계되지 않았습니다.

질문에 나는 PerWebRequest을 사용하지 않을 이유를 찾지 못했습니다. 그냥 사용하십시오.

+0

답변 해 주셔서 감사합니다. 이유를 이해하려면 내 업데이트를 참조하십시오. –

+0

요청 당 ** ** 컨텍스트를 다시 사용하는 것이 좋습니다. 이것은 절대적으로 올바른 일입니다. 요청 당 하나의 컨텍스트를 만드는 것은 헤아릴 수없는 것입니다. 그렇지 않다면 나는 당신의 측정을보고 싶을 것입니다.; 상태없는 컨텍스트가 작동 할 수도 있습니다. EF에 대해 충분히 알지 못합니다. 컨텍스트 상태를 재설정 할 수 있는지 여부는 확실하지 않습니다. ** 여기서 비 결정론의 요소를 소개합니다. ** 일반적으로 요청은 100 % 격리되어 있지만 지금은 그렇지 않습니다. 스레딩 버그와 같습니다 : 결정적이지 않은, undebuggable. 만약 내가 리드로 결정했다면 나는 이것을 금지했다. – usr

0

, 당신은 웹 응용 프로그램의 각 작업자 스레드가 요청에 걸쳐 ObjectContext을 다시 사용하지 마십시오 인스턴스

+0

아니요, 아니요, ObjectContext 클래스를 다시 사용해서는 안됩니다. 또한 단일 ASP.NET 요청을 여러 스레드에서 동시에 실행할 수 있지만 동시에 여러 스레드에서 실행할 수 있습니다. – usr

+0

오른쪽! 나는 엔티티 프레임 워크 종류의 녀석이 아니다. 나는 풀링 된 라이프 사이클을 사용하는 자신의 제안 때문에 실제로 ObjectContext를 재사용 할 수 있다고 추론 한 질문에서 대답을 주겠다. – mookid8000

관련 문제