Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 在C#中,从数据库在应用程序内存中加载键值对的最佳方法_Memory_Load_Key Value - Fatal编程技术网

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

Memory 在C#中,从数据库在应用程序内存中加载键值对的最佳方法,memory,load,key-value,Memory,Load,Key Value,在.net应用程序中,我们需要从数据库加载一些数据(键/值对),并在整个应用程序中使用它们。我们不希望为了一次又一次地获取值而针对每个请求(键)点击数据库。我想知道在这方面的标准和有效方法是什么 感谢所有到目前为止的回复。。我认为,在我的情况下(数据不是很大),我会将数据加载到某个静态keyvaluepair中,并在需要时使用它。我希望将其添加到业务层,这是我过度简化的结构,在基类中,我添加了一个静态构造函数并定义了keyvaluepair: class BaseClass { //dec

在.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();
   }
}

我从前端调用主类中的方法。我想确保在调用a.somethingA()或b.somethingB()时,kvp最初只应加载一次。随后的调用应该只从内存中获取数据。上面的方法是正确的还是我把它弄糟了

在程序启动时将表的所有数据(如果不是太大)加载到哈希表中


然后,应用程序可以从全局/静态哈希表变量快速访问键值对。

在程序启动时将表的所有数据(如果不是太大)加载到哈希表中


然后,您的应用程序可以从全局/静态哈希表变量快速访问键值对。

2种方法自然出现

  • 每键一次请求(慢)
  • 加载整个键值对表 (初始负载缓慢,进一步快速 请求,如果表不可用,则使用大内存 (大)
  • 是不是介于这两者之间
  • 你可以 预加载常用键值对,然后 检查它们是否先加载 在本地内存中创建实体之前 打电话给db。如果您不能确定什么是流行的,您可以引入一些标准来确定它,并且只预加载命中计数>某个常量的keyvaluepairs。当表很大时,第三种方法可能是最好的,但您需要找到一种方法来预加载最流行的对,这听起来是一项相当困难的任务


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

    2种方法自然出现

  • 每键一次请求(慢)
  • 加载整个键值对表 (初始负载缓慢,进一步快速 请求,如果表不可用,则使用大内存 (大)
  • 是不是介于这两者之间
  • 你可以 预加载常用键值对,然后 检查它们是否先加载 在本地内存中创建实体之前 打电话给db。如果您不能确定什么是流行的,您可以引入一些标准来确定它,并且只预加载命中计数>某个常量的keyvaluepairs。当表很大时,第三种方法可能是最好的,但您需要找到一种方法来预加载最流行的对,这听起来是一项相当困难的任务


    当然,您需要将最近请求的对保存在内存中,这样就不会对相同的值对进行连续的sql调用,即使您实现了第一种策略。

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

    NodeCollection<T>["keyofitem"]
    
    NodeCollection[“keyofitem”]
    

    NodeCollection类将维护一个内部键/值集合,该集合将被查询以获取传递的“keyofitem”,如果它存在,则返回它;如果不存在,则执行DB查找,获取值,将其添加到内部集合并返回给调用者。

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

    NodeCollection<T>["keyofitem"]
    
    NodeCollection[“keyofitem”]
    

    NodeCollection类将维护一个内部键/值集合,该集合将被查询以获取传递的“keyofitem”,如果它存在,则返回它;如果不存在,则执行DB查找,获取值,将其添加到内部集合并返回给调用者。

    谢谢Nikhil,我的集合相对较小。我添加了示例代码,以确认该方法是否正确?这里不需要继承。使基类为静态,方法也打印为静态。然后您可以简单地执行BaseClass.Print(键)。这是非常过分简化的。我可能还会在基类的静态构造函数中加入一些锁定机制!如果我将基类设置为静态,那么在上面的代码中,将如何以及何时填充keyvaluepair?每次我调用BaseClass.Print(键)时它都会被填充吗?谢谢Nikhil,我的收藏相对较少。我添加了示例代码,以确认该方法是否正确?这里不需要继承。使基类为静态,方法也打印为静态。然后您可以简单地执行BaseClass.Print(键)。这是非常过分简化的。我可能还会在基类的静态构造函数中加入一些锁定机制!如果我将基类设置为静态,那么在上面的代码中,将如何以及何时填充keyvaluepair?是否每次我调用BaseClass.Print(键)时都会填充它?感谢valentin提供的描述性解决方案。如果您能检查我上面的示例代码以确认方法是否正确,请不胜感激。感谢valentin提供的描述性解决方案。如果您能检查我上面的示例代码以确认该方法是否正确,将不胜感激。数据非常小,我将使用静态keyvaluepai