내 MVC4 앱은 코드 우선 Entity Framework 5.0을 사용합니다. 타이머 스레드에서 SQL Server 데이터에 액세스하려고합니다. 기본 ASP.NET 작업자 스레드에서 사용하는 동일한 파생 DbContext 클래스의 인스턴스를 인스턴스화하고, 사용하고, 처리 할 수없는 이유가 있습니까? (예, 나는 동일한 using()
패턴을 사용하여 인스턴스를 만들고 사용하고 주 스레드에서 개체를 처리합니다.)백그라운드 스레드에서 DbContext 사용
약간의 문제 컨텍스트 : 내 웹 사이트에 데이터베이스의 테이블에 WebsiteEnabled 필드가 있습니다. 현재, 나는 그 값을 읽을 각 GET 요청에 대한 데이터베이스 가져 오기가 발생합니다. 백그라운드 스레드에서 매 15 초마다 값을 읽도록 코드를 변경하고 GET 요청을 읽을 수있는 정적 변수에 값을 저장하려고합니다. 동일한 스레드에서 동일한 DbContext의 여러 인스턴스를 인스턴스화하려고하면 문제가 발생한다는 것을 알고 있습니다. 동일한 제한이 다른 스레드의 동일한 DbContext 인스턴스에 적용되는지 확실하지 않습니다.
우리는 이메일을 확인하고 자주 청소하기 위해 배경 스레드도 사용합니다. 백그라운드 스레드에서 새 컨텍스트를 작성 (및 파기)하고 기본 애플리케이션 스레드의 컨텍스트를 사용하지 않는 한 괜찮습니다. DbContext는 스레드로부터 안전하지 않으므로 여러 스레드에서 공유 할 수 없습니다. 그렇다고해서 각각 db 컨텍스트의 고유 한 복사본을 가진 다중 스레드를 가질 수는 없습니다. 동시성 문제 (동시에 행을 업데이트하려고 시도하는 경우)에주의해야합니다. – Tommy
@ 토미 : 고마워. 코멘트가 아닌 답변으로 작성하여 답변으로 받아 들일 수 있습니다. –
Bob, 답변으로 게시 됨. DbContext를 단일 스레드로 로컬 화하는 한 아무 문제가 없어야합니다. – Tommy