在C#中,从数据库加载应用程序内存中的键值对的最佳方法

时间:2011-03-02 14:28:22

标签: memory load key-value

在我们的.net应用程序中,我们需要从数据库加载一些数据(键/值对)并在整个应用程序中使用它。我们不希望为每个请求(键)命中数据库以一次又一次地获取值。我想知道什么是标准和有效的方法?

感谢所有回复直到现在......我认为,在我的情况下(数据不是很大),我将在一些静态keyvaluepair中加载数据并在需要时使用它。我希望将其添加到业务层,这里是我的简化结构,在基类中我添加了一个静态构造函数并且取消了keyvaluepair:

class BaseClass
{
   //declare static keyvaluepair (kvp)
   static BaseClass()
   {
       //load kvp from database
   }
   public void print(string key)
   {
       //use kvp to get the value for the key
   }
}
class ChildA : BaseClass
{
   public void somethingA()
   {
      //call print(key)
   }
}
class ChildB : BaseClass
{
   public void somethingB()
   {
      //call print(key)
   }}

class main
{
   public void GetChildA()
   { 
       ChildA a = new ChildA();
       a.somethingA();
   }

   public void GetChildB()
   { 
       ChildB b = new ChildB();
       b.somethingB();
   }
}

从前端我从Main类调用该方法。我想确保当我调用a.somethingA()或b.somethingB()时,kvp应该只在最初加载一次。后续调用应该只从内存中获取数据。以上方法似乎是正确的还是我搞砸了?

3 个答案:

答案 0 :(得分:1)

在程序启动时在Hashtable中加载表的所有数据(如果它不是太大)。

然后,您的应用程序可以从全局/静态Hashtable变量中非常快速地访问键值对。

答案 1 :(得分:1)

自然而然地有两种方法

  1. 每个键的单个请求(慢)
  2. 加载整个keyvalue对表 (初始负载缓慢,进一步快速 请求,如果表是大内存使用 大)
  3. 介于两者之间
  4. 你可以     预加载流行的键值对,以及     检查它们是否先装入     在制作真实之前在本地记忆中     打电话给db。如果你无法弄清楚什么是流行的,你可以引入一些标准来解决它,并预加载只有命中数>的keyvaluepairs。一些不变的。第三种方法可能是最好的,当表很大但你需要找到一种方法来预加载大多数流行的对,这听起来是一项非常艰巨的任务。

    当然,您需要在内存中保存最近请求的对,这样即使您实施了第一个策略,也不会为相同的值对进行连续的SQL调用。

答案 2 :(得分:1)

这取决于收藏品的大小。如果它是一个相对较小的集合,您可能希望在应用程序启动时加载它并从那里读取它。但是,如果它是一个更大的集合,或者只是在正常的使用模式下读取了一些键,那么在内存容器中编写自己的内容将会有所帮助,该容器知道如何查询数据库以获取密钥。然后你可以做类似

的事情
NodeCollection<T>["keyofitem"]

NodeCollection类将维护一个内部键/值集合,将查询传递的“keyofitem”,如果存在则返回,如果不存在,则发生数据库查找,获取值,添加到内部收集并返回给来电者。