我有以下代码,它将在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);
处给出不同的错误,如下所示,
是的当然这些是预期的错误。
注意:有时它像魅力一样,我的意思是没有错误。
绝对第一个循环,即顺序foreach
循环工作正常,但性能不是很好看,我爱上了它:)
现在我的问题是,如果我想使用parallel foreach
循环,那么我该怎么做?是否有任何化妆品可以帮助Parallel Foreach循环好看;)
先谢谢。
答案 0 :(得分:5)
数据库连接一次只能运行一个查询,因此当线程在连接繁忙时尝试运行查询时,会出现错误。如果要并行运行查询,每个线程都需要自己的数据库连接。
答案 1 :(得分:2)
虽然您要为每次迭代创建一个新的SqlConnection对象,但所有对象都使用相同的物理数据库连接。这是因为.NET框架使用的连接池。在您的情况下,您需要手动配置连接池的行为。例如,您可以禁用连接池;这会产生性能影响。 Read about connection pooling at MSDN