2012-03-07 97 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