2015-11-16 83 views
1

我在阅读Dapper's document at github,直到我来到这个部分:Buffered vs Unbuffered readers。你会看到:SqlDataReader:缓冲与非缓冲读取器 - 如何?

Dapper的默认行为是执行你的sql并缓存整个 读者返回。这在大多数情况下是理想的,因为它最大限度地减少了数据库中的共享锁 ,并减少了db网络时间。

这段代表什么意思?这实际上是我第一次听到这个消息。有没有什么方法可以读取,例如SqlDataReader,而无需迭代?一次读取所有行?

+0

所有'SqlCommand'的交互都是通过'SqlDataReader'完成的。在内部,'SqlDataAdapter。Fill'方法实例化一个'SqlDataReader'来产生一个'DataTable'。也许这就是他们正在谈论的。 –

+0

@SamAxe它似乎没有):也许他们读取整个读者作为一个流而不解析/阅读列,而连接是开放的;之后和cosing连接后,然后阅读和解析流? –

回答

0

我记得,缓冲区和无缓冲区之间的区别是调用.ToList()扩展方法,以在调用Query将调用返回给调用方之前强制对象实现。本质上,当Dapper读取数据库时,它可以预先实现一切(缓冲),或者在需要数据(无缓冲)时实现。

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

在缓冲模式下,您知道数据读取器在您获得结果的时候已经完成了,并且只要您想要安全的结果就知道您没有让数据读取器的存活时间超过需要并且你可以关闭连接到数据库,如果你想。

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

为什么要用一个呢?

缓冲:

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

无缓冲:

  • 更大的数据集,你不想来一次预载的一切到内存中。
  • 当您负担得起保持数据读取器处于活动状态并且连接打开较长时间时。

我想说,绝大多数情况下,我使用缓冲模式。这是非常罕见的,我有一个足够大的数据集,我想要无缓冲的结果。