C# 从数据库读取数据后,使用哈希表进行临时数据存储

C# 从数据库读取数据后,使用哈希表进行临时数据存储,c#,asp.net,hashtable,C#,Asp.net,Hashtable,我正在寻找意见和最佳编码实践 我需要通过一个查询从数据库中获取信息,比如从MyDB中选择this,that(返回2个字段) 使用哈希表作为临时存储是否错误 有没有更好的方法来完成同样的事情 如果我返回的字段超过2个,那么最好是升级到数据集还是什么 我在寻找简单的效率 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {

我正在寻找意见和最佳编码实践

我需要通过一个查询从数据库中获取信息,比如
从MyDB中选择this,that
(返回2个字段)

  • 使用哈希表作为临时存储是否错误

  • 有没有更好的方法来完成同样的事情

  • 如果我返回的字段超过2个,那么最好是升级到
    数据集
    还是什么

  • 我在寻找简单的效率

    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
        }
    }
    

    您是否考虑过仅为一个键/值对使用
    字典入口
    ,或使用具有两个命名属性的域对象?

    您的建议是在程序中本地缓存整个表。这有优点也有缺点:

    优点:

    • 对于许多小查询来说,速度更快,只需与数据库通信一次
    • 您可以获得数据的不变副本,而无需保持事务处于打开状态
    • 即使数据库脱机,您仍然可以访问数据
    缺点:

    • 你无法获得实时数据
    • 第一次或在应用程序启动时减慢速度,因为它必须读取整个表
    • 在客户端上使用大量内存
    • 更新本地副本不会自动更新数据库中的数据
    结论:


    通常您不应该这样做,您应该在需要时向数据库请求所需的值。但有时它可能有意义。

    这取决于表中有多少记录,以及散列键的“随机”程度。您希望避免将密钥散列到同一个插槽以避免冲突,从而降低性能。

    您最好的选择是创建一个真正简单的数据对象

    private class MyData
    {
        public int Id { get; set; }
        // Etc
    }
    
    接下来,使用强类型字典类

    Dictionary<int, MyData> myDbCache = new Dictionary<int, MyData>();
    
    Dictionary myDbCache=newdictionary();
    
    如果您需要存储键值/par值,我建议您选择
    字典而不是哈希表。

    如果您的数据需要从多个页面访问(可能是这样),您可以将它们存储在静态字段中(实际上使用字典),因此需要为整个应用程序加载一次(对每个用户一次)

    这里封装在一个单例中:

    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];
    
    公共类全局变量
    {
    私有上下文_当前;
    私有字典_dbValues;
    公共字典值
    {
    得到
    {
    if(_dbValues==Null)
    {
    //…在这里加载我们的数据
    }
    返回_dbValues;
    }
    设置
    {  
    }
    公共全球流动
    {
    得到
    {
    如果(_current==Null)
    _当前=上下文();
    返回电流;
    }
    }    
    私有全局()
    {  }
    }
    //可以这样使用
    var value=Globals.Current.DbValues[key1];
    
    谢谢您的示例,字典看起来是一个不错的选择。我有一个问题,如果我正在制作一个实时应用程序(使用SignalR),它有意义吗使用字典临时存储一个标志?例如,如果用户发送了请求a,正在等待另一个用户发送他的请求B,那么在两个请求都收到后,它会插入数据库吗?