2010-11-06 62 views
1

我想在將數據從數據庫寫入我們自己的對象時利用多線程。我們目前正在使用Firebird並使用「只讀」閱讀器FbDataReader檢索數據。C#針對Firebird(.NET)的多線程數據庫訪問

通過在FbDataReader舉行,填充對象記錄我們的週期,添加對象的列表,然後在應用程序中使用。所有這些都發生在我們應用程序的數據訪問層中。

理想情況下,我們想從數據庫中檢索數據(在FbDataReader),然後拆分寫線程之間的對象(每行一個)的工作。我看到的問題是FbDataReader只是向前的,不同的線程可能會導致讀者在另一個線程完成之前執行下一個記錄。

一個解決辦法可能是在FbDataReader轉儲到索引列表,數組或字典但這是有代價的。

沒有人有任何的想法,還是我們只是在浪費我們的時間尋找重構我們的這部分代碼?

回答

0

如果你能獲得的連續記錄大塊不重疊,並且數據讀取器對象分配給每個,那麼你可以使用一個線程每個讀者和獲得的收益,所提供的數據源不引起瓶頸。基本上,您將使用多個閱讀器對象來代替中間存儲空間。

例如

where ID >= 0 && ID < 10000 << block 1 for data reader instance 1 
where ID >= 10000 && ID < 20000 << block 2 for data reader instance 2 
where ID >= 20000 && ID < 30000 << block 3 for data reader instance 3 

這個三個閱讀器的例子將允許你「同時」實例化三個對象。

如果您額外使用圍繞整個過程的C# iterator,則可能有辦法將所有對象返回,就好像它們是單個集合一樣,而不使用任何中間存儲器用於實例。

foreach (object o in MyIterator()) { .... 

這會使對象從單個線程回來,即使它們是在不同的線程上創建的,也會從單個線程使用。我只是最後一部分而已。

+0

我知道使用只向前遊標不可能比一次更快。這就是爲什麼我建議將所有數據分配給索引數組,列表或字典的中間步驟,這些數據可以在線程之間分開。 – Mysaffy 2010-11-06 01:11:10

+0

對於引導修辭問題感到抱歉;他們並不打算侮辱。只是在訪問此主題時給其他人一些想法。你是對的,很明顯你明白了中介的需要。 – 2010-11-06 01:13:27

+0

所以這個問題乞討。你將如何快速地將FbDataReader轉儲到列表,數組或字典中。似乎沒有辦法加快這個過程。感謝您迄今爲止的輸入,對此表示讚賞。 – Mysaffy 2010-11-06 01:33:08

0

你可以嘗試創建一個新的線程,並創建有基於現有的ConnectionString一個新的數據庫連接。 在一個線程中,您可以處理偶數記錄(2,4,6等),在另一個線程中處理奇數記錄(1,3,5等)。 但是這會增加代碼的複雜性。

對於數據庫操作,我更喜歡創建一個新的數據庫連接對象,以在單獨的線程中完成工作,並向用戶顯示進度,以便UI線程不凍結並且應用程序保持響應。