1

私が現在構築しているシステムでは、計算サービスを提供する API に対して Web リクエストを行う必要があります。このサービスには、データベースから取得する必要がある一連の複雑なパラメーターが必要です。現在、これらのエンティティを取得するためにエンティティ フレームワークを使用しています。エンティティごとに、この API にリクエストを送信し、結果を取得し、最後にすべての結果をデータベースに保存します (すべて同期的に行われます)。

エンティティのセットが増えると、このアプローチではスケーリングの問題が発生します (エンティティごとに 30 分ごとに計算サービスを呼び出す必要があるため)。このため、エンティティのデータベース取得と Web リクエストを、他のエンティティの同じ操作と並行して (または非同期で) 行いたいと考えています。(データの読み込み時間を短縮するためではなく、webrequest の完了を待っている間に作業を行うため)

EF 5 コンテキストはスレッド セーフではないため、これを達成するための最良の代替手段は何ですか? 特定の SQL クエリを記述したり、LINQ を使用したりする必要がありますか? 誰もが同様のアプローチのコード例を持っていますか(webrequestのdb検索を並行して)

編集 小さなコードサンプルを追加します(非常に単純化されています)。Web サービスの呼び出しに数秒かかると仮定すると、これはスケーリングされません。

foreach(entityId in entityIds)
{
    var entity = _repository.Find(entityId);
    _repository.LoadData(entity);
    _validator.ValidateData(entity);
    var result = _webservice.Call(entity);
    entity.State = result.State;
}

_repository.SaveChanges();
4

2 に答える 2

1

あなたができることは、プロデューサー/コンシューマー アーキテクチャを使用することです。1 つのスレッドがデータベースにアクセスし、データを のようなものに追加しますBlockingCollection。別のスレッド (または複数のスレッド) がコレクションからデータを読み取り、Web 要求を実行します。

于 2013-05-27T16:57:35.677 に答える