緩衝參數在Dapper dot net中有什麼作用?

.net dapper sqldatareader

Dapper dot net有一個buffer參數(bool),但據我所知,它唯一能做的就是在返回之前將結果轉換為列表。

根據文件

Dapper的默認行為是執行你的sql並在返回時緩衝整個讀者。在大多數情況下,這是理想的,因為它最大限度地減少了數據庫中的共享鎖,並減少了數據庫網絡時間。

但是,在執行大量查詢時,您可能需要最小化內存佔用並僅根據需要加載對象。為此,在Query方法中傳遞,緩衝:false。

我不確定如何將結果轉換為列表來實現此目的。我錯過了什麼嗎?我唯一的想法是它應該將ExecuteReaderCommandBehavior設置為CommandBehavior.SequentialAccess (但它沒有)。

一般承認的答案

但據我所知,它唯一能做的就是在返回之前將結果轉換為列表

你沒有遺漏任何東西。這是關鍵的區別。除非它不是這樣的演員 :實際返回的對像是非常不同的。基本上,有兩種方法可以讀取數據:

  • 在流API中,每個元素都是單獨生成的;這是非常高效的內存,但如果你對每個項目進行大量的後續處理,則意味著你的連接/命令可以長時間“活動”
  • 在緩衝的API中, 產生任何內容之前讀取所有行

如果您正在讀取大量數據(數千到數百萬行),則可能更喜歡非緩衝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”。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因