2017-07-18 3 views
-1

のは、私は単一の項目にデシベルを節約する方法dbに過負荷をかけずに多数の簡単なクエリを実行する最も効率的な方法は何ですか?

public async Task SaveItemToDb(ItemEntity item) { ... } 

があるとしましょうとのは、(I 500,000アイテムとそれを実行すると、ビジネス上の理由で、私は一括操作を行うことができない必要があるとしましょう例えば、私がすることはできませんSaveItemsToDb(IEnumerable<ItemEntity> items)にする)。

これを実行する最善の方法は、同時に実行されているクエリでdbをオーバーロードしないようにすることですが、各クエリは互いに独立していると考えることができます。これはTask.WhenAll(...)のケースですか?

+0

DBを助ける1つの方法は、すべてのクエリを1つのブロックにコンパイルして実行することです。 –

+0

@ShemeerBKあなたは詳しく説明できますか? – user7127000

+0

こんにちは、あなたのシナリオが正しいかどうか分かりません。私の以前のプロジェクトでは、このような問題がありました。私は を各作成オブジェクトに挿入する必要がありました。問題は、接続 が開かれ、クエリが実行され、その後接続が閉じられました。それはしばらくの間、挿入操作 をドラッグしました。単純な回避策は、クラス内のすべてのそれらの挿入クエリを収集し、タイマでブロック を100で実行することでした。あなたの場合に役立つかもしれません。 –

答えて

-1

numTasksを実行していることを確認できます。終わりの手の込んだビットは、すべてのタスクが完了するまで待つことを確認することです。残念ながらCountDownEventには非同期バージョンはありませんので、ブロックされていますが、大したことではないかもしれません。

以下のコードでは、いずれのタスクのエラーも正しく処理されません。それを改善したいかもしれません。

async Task ProcessTasks(IEnumerable<Task> tasks, int numTasks){ 
    var count = new CountDownEvent(0); 
    SemaphoreSlim semaphore = new SemaphoreSlim(numTasks); 
    foreach(var task in tasks){ 
     await semaphore.WaitAsync(); 
     task.ContinueWith(_=>{ 
      semaphore.Release(); 
      count.Signal(); 
      } 
     ); 
    } 
    count.Wait(); // Wait till the count reaches zero 
} 
関連する問題