46

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

这是如何运作的?

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

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

4

1 回答 1

73

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

这个开关的真正含义是:

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

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

于 2012-10-23T08:51:33.647 回答