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

Dar*_*han 2 parallel-processing database-connection c#-4.0

我有以下代码将在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;

        }
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我使用第二个循环即Parallel ForEach循环时,它会在行中给出不同的错误,adapter.Fill(dtTemp);如下所示,

是的当然这些是预期的错误.

  1. 连接已关闭
  2. 连接正在打开,
  3. 数据阅读器已关闭
  4. 读者正在连接.. Blha Blha ...所有连接相关的错误.

注意:有时它像魅力一样工作我的意思是没有错误.

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

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

提前致谢.

Guf*_*ffa 5

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

  • @Darshan:您还需要关闭数据库连接,否则最终会耗尽可用连接. (2认同)
  • @Darshan:是的,你应该手动完成.您应该打开连接一次,而不是让数据适配器为每个查询打开它,并在完成后配置连接和命令对象. (2认同)