.net - dapper 缓冲区/缓存的解释

标签 .net caching dapper

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

这是如何工作的?

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

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

最佳答案

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

这个开关的真正含义是:

  • false :将在收到/使用项目时对其进行迭代 - 基本上,是围绕 IDataReader 的迭代器 block
    • 减号:您只能迭代一次(除非您愿意重新运行查询)
    • 加上:您可以迭代大量查询(数百万行),而不需要一次将它们全部放入内存中 - 因为您只真正查看正在生成的当前行
    • 加上:您无需等待数据结束即可开始迭代 - 只要它至少有一行,您就可以开始迭代
    • 减号:在迭代时连接正在使用中,如果您尝试在连接上调用其他命令,则可能会导致“连接上已经有一个打开的读取器”(或无论确切的措辞是什么)错误。每行基础(这可以通过 MARS 缓解)
    • 缺点:因为消费者可以对每个项目执行他们想要的任何操作(如果他们正在执行复杂的操作,则每行可能需要几分钟的时间),因此命令/读取器可能会打开更长时间
  • true (默认):数据完全消耗到List<T>中在它把它交还给你之前
    • 加上:您可以根据需要多次迭代
    • 缺点:如果查询很大,将它们全部加载到内存中(在列表中)可能会很昂贵/不可能
    • 减号:如果查询很大,在收集最后一行时可能会出现明显的延迟
    • 加号:一旦获得数据,命令就完成了 - 因此该命令与后续操作之间不存在冲突
    • 加上:一旦您获取数据,该命令就已经释放了所有资源(锁等),因此您对服务器的影响最小

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

关于.net - dapper 缓冲区/缓存的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13026558/

相关文章:

DropDownList 样式的 C# ComboBox,如何设置文本?

android - Ant 每次都重建库项目

php - 为什么浏览器要求缓存文件?

c# - Dapper 反序列化 XML

c# - 为什么 INotifyCollectionChanged 不扩展 IList?

c# - 是否可以要求 LINQ 跳过/保留特定索引?

c# - C# 命令行中的自定义主入口点参数

java - JPA 和枚举类型

c# - 如何使用 Dapper 从 SQL Server 获取 bigint 到 long 对象属性?

orm - 有关于小巧 Dapper 文件吗?