2010-04-22 4 views
0

DataContext의 래퍼 개체를 참조하는 정적 필드가 포함 된 정적 클래스가 있습니다.LINQ를 사용할 때 DataReader가 이미 열려 있습니다.

DataContext는 dbml 파일을 만들 때 Visual Studio에서 기본적으로 생성됩니다. &에는 DB에 저장되어있는 각 저장 프로 시저에 대한 메서드가 들어 있습니다.

우리 클래스에는 기본적으로 이러한 저장된 proc 메서드 각각을 실행하는 정적 메서드가 있습니다. &은 LINQ 쿼리를 기반으로 배열을 반환합니다.

예 :

public static TwoFieldBarData[] GetAgesReportData(string pct) 
     { 
       return DataContext 
       .BreakdownOfUsersByAge(Constants.USER_MEDICAL_PROFILE_KEY, pct) 
       .Select(x => new TwoFieldBarData(x.DisplayName, x.LeftValue, x.RightValue, x.TotalCount)) 
       .ToArray(); 
     } 

모든 이제 다음, 우리는 다음과 같은 오류 얻을 :

There is already an open DataReader associated with this Command which must be closed firs

이 간헐적으로 일어나고을 내가 무슨 일이 일어나고 있는지에 대한 궁금 해요. 내 생각 엔 실행중인 메서드와 다음 메서드가 실행되는 사이에 지연이있을 때 DataContext를 잠그고 오류를 던지고있는 것입니다.

에있는 DataContext LINQ 호출을 각각 래핑하여 해당 형식에 대한 배타성을 얻고 다른 요청이 대기열에 포함되도록 할 수 있습니까?

답변

1

DataContext은 수명이 긴 것이 아니며 다중 스레드와 함께 사용해야하는 것은 아닙니다.

정적 멤버는 수명이 오래이며 여러 스레드가 액세스합니다. 그 갈등은 당신의 문제의 근원 일 수 있습니다.

+0

감사합니다. Bryan. 래퍼 클래스를 제거하고 정적 메서드에서 DataContext에 직접 액세스하는 것이 더 좋을까요? (DataContext에서 상속 한 래퍼에 정적 참조를 저장하는 대신)? –

+0

아니요, 수명이 긴'DataContext' 문제는 여전히 남아 있습니다. 대신, 정적 API를 모두 제거하고 수명이 짧은 작업 단위에 대해서만'DataContext' 인스턴스를 생성해야합니다.나는 이것이 당신에게 불가능하거나 바람직하지 않을 수 있음을 알고 있습니다. 그러나,'DataContext'의 디자인은 당신의 사용 시나리오를 지원하지 않습니다. –

0

데이터 컨텍스트를 잠그면 문제가 될 수 있습니다. 조심하지 않으면 성능이 저하되거나 교착 상태가 발생할 수 있습니다. 당신이 (예 : 계층 적 개체 모델을로드) 독자에 기록하지만 순환하고 그 내에서 다른 쿼리 명령을 실행하려고 할 때

이 일반적으로 발생

연결에 MultipleActiveResultSets = true 매개 변수를 추가

시도 선회 가능한 경우 문자열을 사용하여 별도의 전화를 시도하는 것보다 문제를 더 깔끔하게 해결합니다.

http://msdn.microsoft.com/en-us/library/cfa084cz(VS.80).aspx

또한, 당신이 경우 가능한 가장 작은 범위, 단일 "작업 단위"에 대한 데이터 컨텍스트를 사용합니다. 상태를 유지해야하는 경우가 아니라면 (일부 개체를로드 한 다음 한꺼번에 다시 저장하는 등) 데이터 컨텍스트를 대단히 재사용해서는 안됩니다.

+0

감사합니다. 마이크는 그에게 기회를 줄 것입니다. –

0

브라이언 와츠 (Bryan Watts)는 지적했다. DataContext는 수명이 짧아야합니다. 필요한 경우와 약간의 시간 동안 만 DataContext를 사용하고 있는지 확인하십시오.

using(var db = new DataContext()) 
{ 
    // do your things here! 
} 

희망 하시겠습니까?

관련 문제