2012-03-07 129 views
2

我有下面的代碼時會觸發在SQL SERVER 2008R2每個數據庫上查詢數據庫連接,如何處理並行執行C#爲

public DataTable GetResultsOfAllDB(string query) 
     { 
      SqlConnection con = new SqlConnection(_ConnectionString); 
      string locleQuery = "select name from [master].sys.sysdatabases"; 
      DataTable dtResult = new DataTable("Result"); 
      SqlCommand cmdData = new SqlCommand(locleQuery, con); 
      cmdData.CommandTimeout = 0; 

      SqlDataAdapter adapter = new SqlDataAdapter(cmdData); 
      DataTable dtDataBases = new DataTable("DataBase"); 
      adapter.Fill(dtDataBases); 

      // This is implemented for sequential   
      foreach (DataRow drDB in dtDataBases.Rows) 
      { 
       locleQuery = " Use [" + Convert.ToString(drDB[0]) + "]; " + query; 
       cmdData = new SqlCommand(locleQuery, con); 
       adapter = new SqlDataAdapter(cmdData); 
       DataTable dtTemp = new DataTable(); 
       adapter.Fill(dtTemp); 
       dtResult.Merge(dtTemp); 
      } 

      //Parallel Implementation 
      Parallel.ForEach(dtDataBases.AsEnumerable(), drDB => 
       { 
        locleQuery = " Use [" + Convert.ToString(drDB[0]) + "]; " + query; 
        con = new SqlConnection(_ConnectionString); 
        cmdData = new SqlCommand(locleQuery, con); 
        cmdData.CommandTimeout = 0; 
        adapter = new SqlDataAdapter(cmdData); 
        DataTable dtTemp = new DataTable(); 
        adapter.Fill(dtTemp); 
        dtResult.Merge(dtTemp); 
       } 
      ); 

      return dtResult; 

     } 

現在的問題是,當我使用的第二循環即Parallel ForEach循環它給在該行adapter.Fill(dtTemp);我不同的錯誤。如下圖所示

是的,當然,這些都是預期的錯誤。

  1. 連接已關閉
  2. 連接被打開,
  3. 數據讀取器被關閉
  4. 讀卡器連接.. Blha Blha ...所有連接相關的錯誤。

注:有的時候它就像魅力我的意思是沒有錯誤。

而且絕對第一個循環,即連續foreach迴路工作正常,但表現並不好找,我愛上它:)

現在我的問題是,如果我想使用parallel foreach環路相同,那我該怎麼做?是否有任何化妝品可以幫助並行Foreach循環好看;)

在此先感謝。

回答

5

數據庫連接一次只能運行一個查詢,因此當某個線程嘗試在連接忙時運行查詢時,會出現錯誤。如果你想並行運行查詢,每個線程都需要自己的數據庫連接。

+0

是的,你是對的,而且是需要它,我通過創建並行循環爲'CON =新的SqlConnection(_ConnectionString)一個新的連接處理韓元DB連接;'這是不連續的foreach循環,我錯過在連接時有什麼東西?感謝您的回覆。 – Darshan 2012-03-07 06:57:56

+2

@Darshan:您還需要關閉數據庫連接,否則最終會用盡可用的連接。 – Guffa 2012-03-07 07:02:28

+0

連接關閉和打開由'SqlDataAdapter'自己處理。我不打開任何連接或手動關閉它。我想手動做? – Darshan 2012-03-07 07:06:15

2

儘管您爲每次迭代創建一個新的SqlConnection對象,但所有對象都使用相同的物理數據庫連接。這是因爲.NET框架使用的連接池。在你的情況下,你需要手動配置連接池的行爲。例如,您可以禁用連接池;這會對性能產生影響。 Read about connection pooling at MSDN