2010-11-11 77 views
0
查詢數據庫

你好,我有一個情況,實體的CustomerManager倉庫的客戶和供應商 我的目標是:C#如何實現這是由線程

  1. 倉庫是singletone並在運行時打開的DB。
  2. customerManager將客戶管理爲查詢倉庫並更新(在購買員工後)的主題。
  3. 當倉庫中的其中一個項目用完時,我們要求供應商以不同的線程爲我們提供供應商,而供應商做他的事情(讓我們假設它是5秒左右),客戶等待(在隊列中)並調用當供應商方法返回真(我們假設它返回true總是)..

所以我的問題是關於三樣東西:

  1. 設計 - 宜的CustomerManager內部保持他是倉庫ouse和顧客?它似乎是最好的靈魂,是否有人推薦,否則?(c#設計主題)

  2. 多少個線程可以一次去db?可以一個數據庫自己處理它,所以我不需要自己做?我應該爲他們保留SqlCommand(s)嗎?我應該使用數據集還是數據庫?換句話說有人可以告訴我該怎麼做嗎? 我應該爲10個線程做:

    for (int i = 0 ; i < 10 ; i++) 
    { 
        SqlConnection sqlConnection = new SqlConnection(r_ConnectionString);  
        sqlConnection.Open(); 
        sqlConnection.Close(); 
    } 
    

...這樣的連接如游泳池將開放10個connectiones?

**數據庫ADO.NET **話題

  1. 應如何線程排隊等待?(爲了等待供應商的方法來喚醒他們)如何喚醒他們?有沒有在C#中的一個很好的解決方案? (c#線程主題)

我認爲這個問題太長了,但否則會超出上下文,所以我將不勝感激,如果你會在標題中寫下你想參考的問題。

謝謝。

+0

所有的數據庫都被線程查詢:) – Woot4Moo 2010-11-11 23:43:26

+0

@ Woot4Moo所以如果我知道我有10個線程,我應該做sqlConnection.Open()和sqlConnection.Close(); 10次​​,所以池會有10個連接? – 2010-11-11 23:52:43

+0

這聽起來比嘗試從10個線程共享相同的SQL連接好得多... – 2010-11-12 00:03:01

回答

0

使用連接池在.net中實現SqlConnections。您不必擔心連接本身的管理問題。對你的唯一要求是你打開它們後打電話給.close。 .net將以有效的方式爲您管理其餘的內容。

如果你想同時運行多個查詢,那麼你可以調用sqlcommand開始調用和結束調用。

通過使用這兩種方法,您可以在不需要您管理線程的同時獲得多線程行爲。

但是,你在ADO.Net上閱讀了這篇文章,因爲當你發現它的工作原理時,你所談論的很多東西都是不必要的。

對於依賴於您的問題的數據集或數據讀取器而言,數據集雖然是一個非常重的對象,但數據讀取器非常輕便,而且速度很快,可以讓您輕鬆地組合集合。

我更喜歡使用linq2sql雖然或實體框架。 ADO.Net有點脆弱,因爲你需要做大量的數據轉換和手動映射到運行時容易出錯的對象,而不是編譯時間。

1

您的工作線程可通過BlockingCollectionConcurrentQueue進行工作。

連接管理你最好這樣做:

using (SqlConnection conn = new SqlConnection(...)) 
{ 
} 

因爲這樣能確保Dispose()被調用爲您服務。正如其他反饋中指出的那樣,您可以在後臺執行此操作,而不必擔心從ADO.Net manages a pool of physical connections到DB的實際連接數。

沒有人可以告訴你DataSet還是DataReader的效果最好,取決於數據加載後的使用情況。 DataReader依次提供了每條記錄的順序讀取,而DataSet提供了底層DB數據的內存緩存,從這個意義上講,這是一種「更高級別」的抽象。