2013-07-30 24 views
0

我想在一個線程/並行地執行多次有兩個輸入參數(比如100次)的SP。我添加了異步處理= True; MultipleActiveResultSets =在我的連接字符串真實,使用下面的代碼來執行SP通過C#在線程上使用不同的輸入參數執行SQL Server存儲過程?

在button_Click

// ExecuteSPList是具有100 ReportID和按鈕點擊我創建線程100次被調用的名單列表CallInvokeUpdate

  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」的執行需要5秒爲一個 ReportId然後使用這種方法也正在採取某處大約100 * 5 = 500秒。

任何人都可以建議如何減少這段時間並平行運行SP100次。任何執行之間沒有依賴關係。

有什麼建議嗎?

+0

我會作出存儲過程中您的DB調用靜態方法開始。然後管理 –

+0

的多線程,最可能的兩個原因是:SP鎖定表並且不能並行運行,或者您正在限制硬盤驅動器IO。 – Tsabo

+0

@Tsabo我在執行SP之後發現它鎖定了DB中的表。這是否意味着,直到鎖定沒有釋放下一個處理將不會發生。請注意,受SP參數影響的記錄與param2,param3等完全不同。請建議。 – user2519971

回答

0

由於問題是鎖定表,要並行執行SP,您需要更改SP中的隔離級別。要做到這一點

一種方法是這樣的:

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

注意,這可能會導致意外的行爲,但我認爲,只要沒有2個並行查詢修改相同的行應該是不錯的。請閱讀此線程,以瞭解更多有關該方法的

When to use with (nolock)

相關問題