首页 文章

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

提问于
浏览
3

我有一个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 ;'的内容 . 进入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)时间,而不必复制任何数据) .

1 回答

  • 2

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

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

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

相关问题