并行加载到DataSet中的任何问题?

时间:2011-03-26 23:57:04

标签: c# sql-server multithreading ado.net

我有一个Web应用程序,它将SQL Server中的大约50个表加载到DataSet中,基于它构建更复杂的数据结构,然后缓存数据,以便Web应用程序可以更快地执行。

应用程序的初始加载大约需要10秒,其中一半只是从数据库表中加载数据。虽然这在生产中是合理的,但它在开发中会令人沮丧。我想加快速度。

我目前的情况类似于以下伪代码:

var ds = new DataSet();
var tablesToFill = new List<string>() { ... };
connectToDatabase();
foreach (var t in tablesToFill) fill(ds, t);
disconnectFromDatabase();

fill(DataSet,string)方法基本上填写了类似于'Select * from {tablename};'的内容。进入DataSet.Tables [tablename]

我想知道并行加载是否会让事情变得更快。

首先,我将MultipleActiveResultSets = true添加到我的连接字符串(SqlClient)。然后,我尝试了以下伪代码:

var ds = new DataSet();
var tablesToFill = new List<string>() { ... };
connectToDatabase();
ds.EnforceConstraints=false; // without this, get concurrency errors in DataSet
tablesToFill.AsParallel().ForAll(t => fill(ds,t));
ds.EnforceConstraints=true;
disconnectFromDatabase();

这似乎工作正常。在二十几个表的子集中,加载时间减少了66%(2.7秒到0.9秒)。

有什么我应该知道的可以回来后来困扰我吗?根据MSDN,我应该在DataSet上同步写操作,但由于它们都写入不同的表,所以事情似乎工作正常。但是,我只是幸运和/或是否存在可能带来麻烦的情况(或.NET版本)?

谢谢!

编辑:进一步思考,如果您觉得由于线程安全而存在危险,那么如何让每个填充工作在其自己的不同DataSet上并行工作,然后将所有DataTables移动到一个公共DataSet中(在同一个线程中)。我想我可以脱离&amp;将DataTable从一个DataSet快速重新附加到另一个DataSet(O(1)时间,而不必复制任何数据)。

1 个答案:

答案 0 :(得分:2)

  

如何让每个fill在其自己独特的DataSet上并行运行,然后将所有DataTables移动到一个公共DataSet中(在同一个线程中)

为什么不填写单独的DataTables,然后将DataTables添加到DataSet。

等到最后一个DataTable被填满后再将它们放入DataSet中,应该没有问题。