0

2 つの入力パラメーターを持つ SP をスレッド上で複数回 (たとえば 100 回) 実行したいと考えています。Asynchronous Processing=True; を追加しました。接続文字列で MultipleActiveResultSets=true を使用し、以下のコードを使用して SP を実行します

ボタンクリック時

// ExecuteSPList は、100 個の ReportID を持つリストを持つリストであり、ボタンをクリックすると、CallInvokeUpdate を呼び出すスレッドを 100 回作成しています

           Parallel.ForEach(ExecuteSPList, itm =>
            {
                CallInvokeUpdate(itm.ToString());
            });

次に CallInvoke で:

   public void CallInvokeUpdate(string str)
   {
       ExecuteSP(str, strSelectedMonthEndDate);
   }

最後に ExecuteSP メソッドです。

   public string ExecuteSP(string ReportId)
   {
       try
       {
           string connectionString = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;               

           DataSet ds = new DataSet();

           using (SqlConnection sqlConnection = new SqlConnection(connectionString))
           {
               SqlCommand cmd = new SqlCommand("UpdateExecuteSP", sqlConnection);
               sqlConnection.Open();
               cmd.CommandTimeout = 3000000;

               addParameter(cmd, "ReportId", ReportId, SqlDbType.Int);

               cmd.CommandType = CommandType.StoredProcedure;

               IAsyncResult result = cmd.BeginExecuteNonQuery();
               cmd.EndExecuteNonQuery(result);
           }
           return "OK";
       }

       catch (Exception ex)
       {
           throw;
       }
   }

   private void addParameter(SqlCommand cmd, string name, object value, SqlDbType type)
   {

       SqlParameter parameter = new SqlParameter(name, type);

       cmd.Parameters.Add(parameter);

       parameter.Value = value;
   }

私の問題は、ストアド プロシージャ "UpdateExecuteSP" の実行に 1 つの ReportId に対して 5 秒かかる場合、このアプローチを使用すると、約 100*5 = 500 秒かかることです。

この時間を短縮し、SPを100回並行して実行する方法を提案できますか? 実行間に依存関係はありません。

なにか提案を ?

4

1 に答える 1

0

問題はテーブルのロックであるため、SP を並行して実行するには、SP の分離レベルを変更する必要があります。

これを行う1つの方法は次のとおりです。

.....
FROM dbo.TableName with (nolock)
.....

これは予期しない動作につながる可能性があることに注意してください。ただし、2 つの並列クエリが同じ行を変更しない限り、問題はないと思います。メソッドの詳細については、このスレッドをお読みください。

(nolock) を使用する場合

于 2013-07-31T10:31:50.190 に答える