SqlDataReader:缓冲与未缓冲的读者 - 如何?

时间:2015-11-16 22:36:21

标签: c# dapper sqldatareader datareader

在我来到这一部分之前,我正在阅读Dapper's document at github Buffered vs Unbuffered readers 。你会看到:

  

Dapper的默认行为是执行你的sql并缓冲整个   读者回来了。这在大多数情况下是理想的,因为它最小化共享   锁定数据库并减少数据库网络时间。

这段是什么意思?这实际上是我第一次听到这个。有没有办法读一个,比如SqlDataReader,没有迭代?一次读取所有行?

1 个答案:

答案 0 :(得分:0)

我记得,buffered和unbuffered之间的区别是调用.ToList()扩展方法,在调用Query之前强制对象实现,然后将控制权返回给调用者。

基本上,当Dapper读取数据库时,它可以预先实现所有内容(缓冲),也可以在需要数据(无缓冲)时实现。

在无缓冲模式下,当您迭代结果时,它会从内部数据读取器读取并将其转换为您在每个循环上指定的对象。如果您花费很长时间来完成工作,那么它可能会使数据读取器长时间保持打开状态。

在缓冲模式下,您知道数据读取器在您获得结果时已经完成,并且您可以安全地使用数据读取器,并且知道您没有使数据读取器保持活动的时间长于其所需的时间。如果需要,您可以关闭与数据库的连接。

另外,请注意,在无缓冲模式下,您无法迭代初始查询的结果,并在同一连接上启动另一个查询。

为什么要使用其中一个?

缓冲:

  • 较小的数据集
  • 当您想确保读者快速完成时
  • 因此,您可以在查询后关闭连接
  • 或者您可以在迭代第一个查询的结果时重用另一个查询的连接。

无缓冲:

  • 您不希望一次将所有内容预先加载到内存中的较大数据集。
  • 当您能够保持数据阅读器处于活动状态并且连接打开更长时间时。

我会说,对于绝大多数情况,我使用缓冲模式。我很少有足够大的数据集,我想要无缓冲的结果。