2012-10-23 51 views
30

我使用dapper从IE数据库返回对象为IEnumerable。 由于默认的精灵将缓冲区设置设置为true。短小精悍缓冲区/高速缓存的说明

这是如何工作的?

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

如果某人在表格中编辑/删除/添加行,会发生什么情况。必须精简重新缓存此查询的所有数据?

回答

44

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

什么这个开关的真正含义是:

  • false:将迭代的项目,因为他们收到/消耗 - 基本上,围绕IDataReader
    • 减去一个迭代块:你只能重复一次(除非你很乐意重新运行查询)
    • 加上:你可以遍历巨大的查询(数百万行),而不需要它们全部在内存中 - 因为你只是真的看在当前租行正在产生
    • 加上:你不需要等待数据的末尾开始迭代 - 只要它至少有一行,你就很好去
    • minus:连接是在迭代时使用,这可能会导致“如果您尝试以行为单位调用其他命令,则”连接上已经有一个开放的阅读器“(或者无论确切的措辞是什么)错误(这可以是通过MARS)
    • 减去缓解:因为消费者可以做他们每个项目想要的任何东西(这可能需要几分钟每行,如果他们正在做的事情复杂),命令/读者可能开放供较长
  • true(默认):数据被完全消耗为List<T>它交给它之前还给你
    • 加:您可以重复它,只要你喜欢
    • 减去多次:如果查询是巨大的,装载它们全部进入内存(在列表中)可能是昂贵的/不可能的
    • 减去:如果查询很大,可能会有明显的延迟,但它会收集最后一行
    • plus:一旦获取数据,命令是完成 - 因此与后续操作之间不存在冲突
    • 加:只要您获取数据,命令已经发布的任何资源(锁等),所以你在服务器上的影响微乎其微。

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