2017-05-18 20 views
0

私はこれはかなり一般的な質問ですけど、私と一緒に負担してください:私はちょうどentityframeworkキャッシュ別名ChangeTrackerつまずいEntityFrameworkコアは、ロードバランス

。我々が持っているもの

は、エンティティのコアとネットコアを用いた小型microserviceです。このマイクロサービスは、IISの背後にある負荷分散された(RoundRobin)ものです(私が推測することはできません)。それらをInstance1とInstance2と呼ぶことができます。

私は、DB内の1つのエントリを持っている、例えば(簡単にするために、ここでJSONとして表される):今、何が起こるか

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

今、私は(から答える形にこれをロードしますInstance1)、FirstNameをThomasに変更し、PUT経由で保存します。これはInstance2によって行われます。今私はそのエントリを得る別の要求をします。この要求はInstance1によって返されます。これは、(これは変更トラッカーが変更されていないので)キャッシュからロードします。こうして私は、変更トラッカーに問題を持つ多くの人々であることを

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

あるようです取得し、これは非常にあるので、一つの共通の答えは、私には全く間違っていると思われるすべての要求、とdbcontextを再構築することです"高価な"操作。

また、変更トラッカーが満杯になるため、新しいデータの挿入が遅くなり、時間の経過とともに遅くなることに気付きました。そのため、マイクロサービスを毎回リサイクルする必要があります。

だから私の質問は次のとおりです。 私はすべてのリクエストでdbcontextを再初期化せずにこの問題を回避するにはどうすればよいですか? キャッシュを無効にすることができる答えが見つかったが、1回のDB操作でのみ、このオプションをすべてのDB操作に追加する必要があり、毎回の要求でDBコンテキストを再初期化すること。 私は何を見落としましたか?簡単な解決策が必要です。

+2

は、このセクション及び底部付近に大きな赤い警告を参照してください。 dbコンテキストごとの変更を追跡するために使用されます。私は正しい選択だと思う要求ごとに新しいDBのコンテキストを使用してください。キャッシュが必要な場合は、この目的のためにdbコンテキストを使用しないでください。たとえば、.net System.Runtime.Cachingのmemcacheまたはbuildinを使用します。もちろん、キャッシュをデータベースと同期させる必要がありますが、dbコンテキストは追跡された(同期されていない)エンティティで膨大になることはありません。新しいDBコンテキストを作成するBtwは、その背後に接続プールがあるため、非常に安価で軽い操作です。 –

+2

さて、あなたは真剣にそれを台無しにしました。 DbContextは、デフォルトの動作であるスコープ(リクエストごとに1つのインスタンス)を持たなければなりません。あなたはどこかでシングルトンとして持っている必要があります。より良い利用のRedisやキャッシング – Tseng

+0

を配布するための似たようなさて、私は自分のリポジトリにデシベルコンテキストを注入。私のレポはコントローラに注入されますが、シングルトンとして注入されるので、これは私の間違いです。リポジトリをScopedにすると、リクエストごとに作成し、新しいDBコンテキストを注入する必要があります。 明日お試しになります。アンサーに感謝します! – PWFraley

答えて

0

は、Entity Frameworkのを利用して、あなたのすべての注入されたクラスがあなたのDbContextと同じ寿命を持っていることを確認してください。デフォルトはScopedです。簡単な間違いをして汗をかくことはありません!私はあなたがキャッシュメカニズムとして変更トラッカのことを考えてすべきではないと思います https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection#registering-your-own-services

関連する問題