.net - 缓冲参数在 Dapper dot net 中起什么作用?

标签 .net sqldatareader dapper

Dapper dot net 有一个 buffer 参数(bool),但据我所知,它唯一做的事情就是在返回之前将结果转换为列表它。

根据 documentation :

Dapper's default behavior is to execute your sql and buffer the entire reader on return. This is ideal in most cases as it minimizes shared locks in the db and cuts down on db network time.

However when executing huge queries you may need to minimize memory footprint and only load objects as needed. To do so pass, buffered: false into the Query method.

我不确定如何将结果转换为列表来实现这一点。我错过了什么吗?我唯一的想法是,它应该将 ExecuteReaderCommandBehavior 设置为 CommandBehavior.SequentialAccess (但事实并非如此)。

最佳答案

but as far as I can tell the only thing it does is cast the result to a list before returning it

你没有错过任何东西。这是关键的区别。但它不是这样的强制转换:实际返回的对象非常不同。基本上,有两种读取数据的方式:

  • 在流式 API 中,每个元素都是单独生成的;这是非常高效的内存效率,但是如果您对每个项目进行大量后续处理,则意味着您的连接/命令可能会长时间处于“事件”状态
  • 在缓冲 API 中,所有行都会在生成任何内容之前读取

如果您正在读取大量数据(数千到数百万行),则非缓冲 API 可能更可取。否则会使用大量内存,并且在第一行可用之前可能会出现明显的延迟。但是,在大多数常见情况下,读取的数据量都在合理的范围内,因此在将其传递给调用者之前将其插入列表中是合理的。这意味着命令/读取器等返回之前已完成。

顺便说一句,缓冲模式还避免了常见的“连接上已经有一个打开的读取器”(或任何确切的措辞)。

关于.net - 缓冲参数在 Dapper dot net 中起什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697509/

相关文章:

c# - 从 .net 的角度来看,exe 和 dll 之间有什么特别的区别吗?

sql - 枚举器的 SQL Select 优化

c# - 在 Asp.net 中检查数据读取器是否有行

c# - 是否有可能在dapper中执行代码优先方法

C#如何将 "register"类变成 "plug-ins"服务类?

c# - 从类属性创建通用列表

c# - 每隔15分钟获取给定日期到 'now'之间的数据

C#、Dapper、SQL Server 和连接池

c# - 将 Dapper 与 '?' 一起使用

c# - 对 SQL 2005 中的程序集使用 WITH PERMISSION_SET = UNSAFE 不好吗?