【问题标题】:Explanation of dapper buffer/cachedapper 缓冲区/缓存的解释
【发布时间】:2012-10-23 08:42:28
【问题描述】:

我使用 dapper 将我的数据库中的对象作为 IEnumerable 返回。 由于默认 dapper 将缓冲区设置设置为 true。

这是如何工作的?

如果 dapper 缓存第一个查询,然后从内存中获取对象。

如果有人在表格中编辑/删除/添加行会发生什么。 dapper 是否必须为此查询再次重新缓存所有数据?

【问题讨论】:

    标签: .net caching dapper


    【解决方案1】:

    缓冲区与缓存无关。 Dapper 不包括任何类型的数据缓存(尽管它确实有一个与它如何处理命令相关的缓存,即“这个命令字符串,具有这种类型的参数,以及这种类型的实体 - 具有这些相关的动态生成的配置方法命令并填充对象”)。

    这个开关的真正含义是:

    • false:将在接收/消费项目时对其进行迭代 - 基本上,围绕 IDataReader 的迭代器块
      • 减号:您只能迭代一次(除非您愿意重新运行查询)
      • 另外:您可以迭代 巨大 查询(数百万行),而无需一次将它们全部存储在内存中 - 因为您只需要真正查看正在生成的当前行
      • 另外:您无需等待数据结束即可开始迭代 - 只要它至少有一行,您就可以开始了
      • 减号:在您迭代时连接正在使用中,如果您尝试在基于每行(这可以通过 MARS 缓解)
      • 减号:因为消费者可以为每个项目做任何他们想做的事情(如果他们正在做一些复杂的事情,每行可能需要几分钟),命令/阅读器可能会打开更长时间
    • true(默认值):在将数据交还给您之前,数据已完全消耗到 List<T>
      • 另外:您可以随意迭代它多次
      • 减号:如果查询量很大,将它们全部加载到内存中(在列表中)可能会很昂贵/不可能
      • 减号:如果查询很大,在收集最后一行时可能会有明显的延迟
      • 另外:一旦你得到数据,命令就完成了——所以这与后续操作之间没有冲突
      • 另外:一旦您获得数据,该命令就已经释放了所有资源(锁等),因此您对服务器的影响最小

    大多数查询仅返回中等数量的数据(例如,少于 100 条记录),因此我们很高兴默认 (true) 为大多数情况提供了最合适的行为。但我们会为您提供该选项,以满足不同的使用场景。

    【讨论】:

    • 这个功能拯救了我的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2011-03-12
    • 2015-03-25
    • 2017-10-08
    • 2014-10-21
    • 2011-09-01
    相关资源
    最近更新 更多