精致的点网有一个buffer
参数(布尔值),但据我所知only它所做的就是在返回结果之前将结果转换为列表。
根据文档 https://github.com/StackExchange/Dapper#buffered-vs-unbuffered-readers:
Dapper 的默认行为是执行您的 sql 并缓冲整个
返回时的读者。这在大多数情况下都是理想的,因为它最大限度地减少了共享
锁定数据库并减少数据库网络时间。
但是,当执行大量查询时,您可能需要最小化内存
占用空间并仅根据需要加载对象。为此,请通过缓冲:
false 进入 Query 方法。
我不确定如何将结果转换为列表来实现这一点。我错过了什么吗?我唯一的想法是它应该设置CommandBehavior
为了ExecuteReader
to CommandBehavior.SequentialAccess
(但事实并非如此)。
但据我所知,它所做的唯一一件事就是在返回结果之前将结果转换为列表
你没有遗漏任何东西。这是关键的区别。除非它不是一个cast因此:实际返回的对象非常不同。基本上,有两种读取数据的方式:
- 在流 API 中,每个元素都是单独生成的;这是非常高效的内存效率,但是如果您对每个项目进行大量后续处理,则意味着您的连接/命令可能会长时间处于“活动”状态
- 在缓冲 API 中,所有行都会被读取before任何东西都会产生
如果您正在读取大量数据(数千到数百万行),则非缓冲 API 可能更可取。否则会使用大量内存,并且在第一行可用之前可能会出现明显的延迟。但是,在大多数常见情况下,读取的数据量都在合理的范围内,因此在将其传递给调用者之前将其推入列表中是合理的。这意味着命令/读取器等已完成before它返回。
附带说明一下,缓冲模式还避免了常见的“连接上已经有一个打开的读取器”(或者无论确切的措辞是什么)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)