Dapper dot net有一个buffer
参数(bool),但据我所知,它唯一能做的就是在返回之前将结果转换为列表。
根据文件 :
Dapper的默认行为是执行你的sql并在返回时缓冲整个读者。在大多数情况下,这是理想的,因为它最大限度地减少了数据库中的共享锁,并减少了数据库网络时间。
但是,在执行大量查询时,您可能需要最小化内存占用并仅根据需要加载对象。为此,在Query方法中传递,缓冲:false。
我不确定如何将结果转换为列表来实现此目的。我错过了什么吗?我唯一的想法是它应该将ExecuteReader
的CommandBehavior
设置为CommandBehavior.SequentialAccess
(但它没有)。
但据我所知,它唯一能做的就是在返回之前将结果转换为列表
你没有遗漏任何东西。这是关键的区别。除非它不是这样的演员 :实际返回的对象是非常不同的。基本上,有两种方法可以读取数据:
如果您正在读取大量数据(数千到数百万行),则可能更喜欢非缓冲API。否则会使用大量内存,即使第一行可用,也可能会有明显的延迟。但是,在大多数常见情况下,读取的数据量都在合理的限制范围内,因此在将其传递给调用者之前将其推入列表是合理的。这意味着命令/阅读器等在它返回之前已经完成。
作为旁注,缓冲模式也避免了那么常见的“连接上已经有一个开放的阅读器”(或者无论确切的措辞是什么)。
我不得不对@ chris-marisic不同意......当使用buffered:true时,我在那条确切的行( data.ToList()
)遇到了多个“Out Of Memory”异常。它不是一个“zillion rows X bazillion columns”查询,只是一个常规的5-6k行SQL结果,大约有30列。
这实际上取决于您的配置。例如,您的SQL和IIS是否在同一台物理计算机上运行。 IIS机器上安装了多少内存,页面文件设置是什么等。如果Web服务器有2 GB或更少 - 请考虑为超重报告设置“buffered:false”。