2015-11-16 82 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讀取數據庫時,它可以預先實現一切(緩衝),或者在需要數據(無緩衝)時實現。

當您在未緩衝模式下迭代結果時,它將從內部數據讀取器讀取並將其轉換爲您在每個循環中指定的對象。如果您花費很長時間來完成您的工作,那麼它可能會使數據讀取器長時間處於打開狀態。

在緩衝模式下,您知道數據讀取器在您獲得結果的時候已經完成了,並且只要您想要安全的結果就知道您沒有讓數據讀取器的存活時間超過需要並且你可以關閉連接到數據庫,如果你想。

另外,請注意,在非緩衝模式下,您無法迭代初始查詢的結果並在同一連接上啓動另一個查詢。

爲什麼要用一個呢?

緩衝:

  • 較小的數據集
  • 如果你想確保讀者快速完成
  • 所以,你可以關閉查詢後連接
  • 或者你可以重複使用的連接在迭代第一個結果的同時查詢另一個查詢。

無緩衝:

  • 更大的數據集,你不想來一次預載的一切到內存中。
  • 當您負擔得起保持數據讀取器處於活動狀態並且連接打開較長時間時。

我想說,絕大多數情況下,我使用緩衝模式。這是非常罕見的,我有一個足夠大的數據集,我想要無緩衝的結果。