2010-02-05 136 views
1

我在尋找意見和最佳編碼實踐。從數據庫讀取數據後使用HashTable進行臨時數據存儲

我需要從數據庫中獲取信息,例如SELECT this, that FROM MyDB(返回2個字段)。

  1. 將散列表用於臨時存儲是否是錯誤的?

  2. 有沒有更好的方法來完成同樣的事情?

  3. 如果我返回2個以上的領域,最好是加強到DataSet什麼?

我正在尋找簡單的效率。

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     GetData(); 

     foreach (DictionaryEntry de in ht) 
     { 
      DoSomething(Convert.ToInt32(de.Key), de.Value.ToString()); 

      DoMore(Convert.ToInt32(de.Key), de.Value.ToString()); 

      //etc... 
     } 
    } 

    Hashtable ht = new Hashtable(); 

    private void GetData() 
    { 
     //connect to DB and use reader to fill hashtable ht with results.. 
    } 

    private void DoSomething(int key, string value) 
    { 
     //do something with hashtable ht data 
    } 

    private void DoMore(int key, string value) 
    { 
     //do something else with hashtable ht data 
    } 
} 

回答

0

你有沒有考慮只是一個鍵/值對或有兩個命名屬性使用域對象DictionaryEntry

1

你提出的是在你的程序中本地緩存整個表。這有優點和缺點:

優點:

  • 加快解決許多小的查詢,只需要一次與數據庫進行通信。
  • 您可以在不需要保存事務的情況下獲得不變的數據副本。
  • 即使數據庫脫機,您仍然可以訪問您的數據。

缺點:

  • 你沒有得到的實時數據。
  • 第一次,或在應用程序啓動時減慢,因爲它必須讀取整個表。
  • 在客戶端使用大量內存。
  • 更新您的本地副本不會自動更新數據庫中的數據。

結論:

通常你不應該這樣做,你應該只要求你想要當你需要他們的價值觀數據庫。但有時候它可能是有道理的。

+0

我有一個問題,它將使意義,如果我做一個實時的應用程序(與SignalR)使用詞典<>臨時存儲標誌?例如,如果用戶發送了請求A,並且正在等待另一個用戶發送他的請求B,那麼在接收到兩個請求之後,它將插入到數據庫中? – 2016-05-10 13:58:11

0

這將取決於您在桌上有多少條記錄以及散列鍵的「隨機」。您希望避免將密鑰散列到同一個插槽以避免衝突,從而降低性能。

1

最好的辦法是創建一個真正簡單的數據對象。

private class MyData 
{ 
    public int Id { get; set; } 
    // Etc 
} 

接下來,使用強類型的字典類。

Dictionary<int, MyData> myDbCache = new Dictionary<int, MyData>(); 
0

我會建議你選擇Dictionary<string,string>而不是哈希表,如果你需要存儲鍵/面值。

0

如果需要從多個頁面訪問,這大概就是這樣你的數據,你可以將它們存儲在一個靜態字段(確實使用字典),所以它需要整個應用程序被加載一次(VS一次每用戶)。

這裏封裝在一個單:

public class Globals 
{ 
    private Context _current; 
    private Dictionary<int, string> _dbValues; 

    public Dictionary<int, string> DbValues 
    { 
    get 
    { 
     if (_dbValues == Null) 
     { 
     // ... Load our data here 
     } 
     return _dbValues; 
    } 
    set 
    { 
    } 

    public Globals Current 
    { 
    get 
    { 
     if(_current == Null) 
     _current = Context(); 
     return _current; 
    } 
    }  

    private Globals() 
    { } 


} 

// Can be used this way 
var value = Globals.Current.DbValues[key1]; 
+0

謝謝你的例子,詞典看起來像要走的路。 – user1017477 2010-02-05 15:21:39