2011-03-26 21 views
3

我有一個Web應用程序,它從SQL Server中將50個表加載到DataSet中,基於此構建更復雜的數據結構,然後緩存數據以便Web應用程序可以更快地執行。並行加載到DataSet中的任何問題?

應用程序的初始負載大約需要10秒,其中一半隻是從數據庫表中加載數據。雖然這在生產中是合理的,但是在開發中卻令人沮喪。我想加快速度。

什麼我目前是類似於下面的僞代碼:

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

填充(DataSet中,字符串)方法基本上填補了類似的東西「從{}表名SELECT *;」進入DataSet.Tables [tablename]

我想知道如果並行加載會使事情變得更快。

首先,我在我的連接字符串(SqlClient)中添加了MultipleActiveResultSets = true。然後,我嘗試了下面的僞代碼:

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的說法,我應該在DataSets上同步寫入操作,但由於它們都寫入不同的表,所以事情看起來很好。但是,我只是很幸運,並且/或者是否存在可能帶來麻煩的場景(或.NET版本)?

謝謝!

編輯:進一步思考,如果您覺得由於線程安全而導致這樣做是危險的,那麼讓每個填充並行處理它自己獨特的DataSet,然後將所有DataTables移動到一個通用DataSet中(在同一個線程中)如何。我假設我可以分離&將DataTable從一個DataSet快速重新附加到另一個DataSet(O(1)次,而不必複製任何數據)。

+0

您是否在具有多個物理內核的機器上運行?如果MSDN說同步,那麼應該同步你。 – 2011-03-27 00:07:08

+2

多線程錯誤只有在生產環境中才會出現。如果MSDN說它不是線程安全的,我會接受他們的話。 – driis 2011-03-27 00:07:51

+0

在Core i7上運行;只有一個物理處理器,多個內核。如果我在這裏沒有遇到問題,我是否會在具有多個物理處理器的機器上運行? – 2011-03-27 00:12:29

回答

2

一下怎麼樣在平行其獨特的數據集中的每個填充工作,然後所有的數據表移動到一個共同的數據集(在同一個線程)

爲什麼不填寫單獨的數據表,然後添加數據表到DataSet。

在將它們放入DataSet之前等待直到最後一個DataTable被填充,並且應該沒有問題。

+0

您還需要製作多個保持連接的表格適配器,因此創建胎面連接池可能是個好主意。 – Damian 2011-11-07 17:12:25