2017-05-18 2 views
0

나는 이것이 매우 일반적인 문제입니다 알고 있지만 나 참아주세요 : 난 그냥 entityframework 캐시 일명 ChangeTracker 걸려 넘어EntityFramework 코어 Loadbalanced

.

엔티티 코어가 포함 된 net 코어를 사용하는 소형 마이크로 서비스가 있습니다. 이 마이크로 서비스는 IIS 뒤에로드 밸런싱 (RoundRobin)되어 있습니다 (지금까지 추측 할 수 없었던 모든 것). Instance1 및 Instance2로 호출 할 수 있습니다.

지금 무슨 일이 :

I (예를 들어 JSON으로 여기 편의상 대표), DB를 하나 개의 항목이 :

{ Name: "Test", FirstName: "T." }

은 이제부터 (형태로 답을이로드 Instance1)을 수정하고 FirstName을 Thomas로 수정 한 다음 PUT을 통해 저장합니다.이 작업은 Instance2에서 수행합니다. 이제 그 요청을 얻기 위해 또 다른 요청을합니다. 이 요청은 Instance1에 의해 응답되며, 이는 Changetracker가 변경되지 않았으므로 캐시에서로드합니다. 이것은 매우이기 때문에, 따라서 나는

{Name: "Test", FirstName: "T."}

은 완전히 잘못된 것 같다 나에 대한 모든 요청과 함께 dbcontext을 다시 변경 추적기와 하나의 공통 대답에 문제가 갖는 많은 사람들이있는 것 같습니다 얻을 "비싼"조작.

또한 변경 추적기가 채워지기 때문에 새로운 데이터를 삽입하는 것이 시간이 지남에 따라 느려지고 느려지므로주의해야합니다. 따라서 매번 한 번씩 마이크로 서비스를 재활용해야합니다.

제 질문은 : 요청마다 dbcontext를 다시 초기화하지 않고 어떻게이 문제를 해결할 수 있습니까? 캐싱을 사용하지 못하게하는 몇 가지 답변을 찾았지만 단일 db 작업에만 해당됩니다. 즉, 모든 DB 작업에이 옵션을 추가해야한다는 것을 의미합니다. 모든 요청에 ​​대해 db 컨텍스트를 다시 초기화하는 것처럼 거의 잘못되었습니다. . 내가 간과 한 것은 간단한 해결책이 있어야한다는 것입니다!

+2

:

이 부분과 아래쪽에 큰 빨간색 경고를 참조하십시오. db 컨텍스트 별 변경 내용을 추적하는 데 정확히 사용됩니다. 요청 당 새로운 db 컨텍스트를 사용하십시오. 올바른 선택이라고 생각합니다. 캐시가 필요하다면 db 컨텍스트를이 용도로 사용하지 말고 memcache 또는 build.internet.Runtime.Caching을 사용하십시오. 물론 캐시를 데이터베이스와 동기화해야하지만 db 컨텍스트는 추적 된 (동기화되지 않은) 엔티티로 비대화되지 않습니다. 새로운 db 컨텍스트를 만드는 Btw는 그 뒤에 연결 풀이 있기 때문에 매우 싸고 가벼운 작업입니다. –

+2

네, 진지하게 엉망이되었습니다. DbContext는 기본 동작 인 범위를 지정해야합니다 (요청 당 하나의 인스턴스). 어딘가에 싱글 톤이 있어야합니다. 더 나은 Redis 또는 유사한 캐시 캐싱을 사용하여 – Tseng

+0

그럼 내 저장소에 DB 컨텍스트를 주입. 내 레포가 컨트롤러에 주입되지만 싱글 톤이므로 이것이 내 실수 인 것 같습니다. 내 저장소를 Scoped로 만들면 모든 요청과 함께 새 데이터베이스 컨텍스트를 주입해야합니다. 나는 내일 이것을 시도 할 것이다, 당신의 ansers에 감사드립니다! – PWFraley

답변

관련 문제