如何处理数据库连接的并行执行C#

时间:2012-03-07 06:31:24

标签: c#-4.0 database-connection parallel-processing

我有以下代码,它将在SQL SERVER 2008R2中的每个数据库上触发查询,

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 ...所有与连接相关的错误。
  5. 注意:有时它像魅力一样,我的意思是没有错误。

    绝对第一个循环,即顺序foreach循环工作正常,但性能不是很好看,我爱上了它:)

    现在我的问题是,如果我想使用parallel foreach循环,那么我该怎么做?是否有任何化妆品可以帮助Parallel Foreach循环好看;)

    先谢谢。

2 个答案:

答案 0 :(得分:5)

数据库连接一次只能运行一个查询,因此当线程在连接繁忙时尝试运行查询时,会出现错误。如果要并行运行查询,每个线程都需要自己的数据库连接。

答案 1 :(得分:2)

虽然您要为每次迭代创建一个新的SqlConnection对象,但所有对象都使用相同的物理数据库连接。这是因为.NET框架使用的连接池。在您的情况下,您需要手动配置连接池的行为。例如,您可以禁用连接池;这会产生性能影响。 Read about connection pooling at MSDN