質問: 私はKafkaのキューを高い処理速度で消費し、その結果を.net core 2.1のEFを使ってMySqlに保存しようとしています`AddDbContext`と`AddDbContextPool`両方を使用しようとしましたが、両方のシナリオで問題が発生しました。 1) `AddDbContext`を使用する`AddDbContext` 、 `transient`にスコープを設定することが唯一の方法でした。データ挿入を呼び出す必要があるたびに、新しい`DataContext`インスタンスを取得します。私のキューは大きく、結局mqSQLサーバーへの接続が多すぎることになるので、結局私はたくさんのタイムアウトエラーを出し始めます。 一時的なエラーで再試行するためのオプションを追加することができます(タイムアウトもそのうちの1つです)が、 `DataContext`インスタンスの数をデータベースに影響を与え`DataContext`数に減らす方法に主に関心があります。これは私に次の試みをもたらしました 2) `AddDbContextPool`を使用しているときに、スコープを`transient`に設定できなかったため、構文が見つかりませんでした。ありますか?すべての呼び出しに対して新しいインスタンスを取得できないということは、一時的な寿命で通常解決される別の種類の奇妙なエラーが発生することを意味します。 `An attempt was made to use the context while it is being configured. A DbContext instance cannot be used inside OnConfiguring since it is still being configured at this point. This can happen if a second operation is started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.` また、私の理解にプールサイズパラメータ`AddDbContextPool`ちょうどのためのキャッシュサイズ設定され`DbContext`オブジェクトを再利用するのと決して総接続数を防止しています。 1つのインスタンスが利用可能になるまで次の "get DBContext"呼び出しをブロックできるようにプールが飽和状態になると私は大好きです。 それで、コミュニティに対する私の質問は、この問題をどうやって解決するかです。 `DbContext`インスタンスの数を10などの固定数に減らし、それらをキャッシュに入れたいと`DbContext`ます。再試行を許可するようにオプションを設定しますが、ここでもタイムアウトは外部の理由で発生します。コードがデータベースにメッセージを保存しようとする何百ものインスタンスを作成しているためではありません。
回答: > 範囲を一時的に設定できなかったため、構文が見つかりませんでした。ありますか? > > いいえ、DbContextの有効期間はキャッシュによって制御されているためです。 DbContextクラスはスレッドセーフではないため、表示されるエラーメッセージは複数のスレッドから同じDbContextのインスタンスにアクセスすることによって発生します。実際、メッセージキューからメッセージを消費するときにスコープを作成していないため、DbContextプールが正しく機能しないことを意味します。したがって、DbContextインスタンスは複数のスレッドで共有されます。このスコープは、HTTPリクエストが到着したときにMVCのカバーの下に作成されますが、他の種類のアプリケーションでは自分で作成する必要があります。 DbContextプーリングと接続プーリングの間にも違いがあることに注意してください。アプリケーションからの接続数を制御する必要がある場合は、接続プールを使用してください。 > この問題を解決するには? > > 私はコンテキストプーリングをまったく使用せず、代わりに、キューから消費される多数のスレッドを制御するためのスロットルメカニズムを設定します。