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

我有一个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中(在同一个线程中).我想我可以脱离&将DataTable从一个DataSet快速重新附加到另一个DataSet(O(1)时间,而不必复制任何数据).

最佳答案

how about having each fill work on its own distinct DataSet in parallel and then moving all the DataTables into a common DataSet (in the same thread)

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

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

点赞