2012-10-23 42 views
30

我使用dapper從IE數據庫返回對象爲IEnumerable。 由於默認的精靈將緩衝區設置設置爲true。短小精悍緩衝區/高速緩存的說明

這是如何工作的?

如果dapper緩存第一個查詢,然後從內存中獲取對象。

如果某人在表格中編輯/刪除/添加行,會發生什麼情況。必須精簡重新緩存此查詢的所有數據?

回答

44

緩衝區與緩存無關。 Dapper不包含任何類型的數據緩存(儘管它確實有一個與它如何處理命令有關的緩存,例如「這個命令字符串,這種類型的參數和這種類型的實體 - 具有這些關聯的動態生成的方法來配置命令並填充對象「)。

什麼這個開關的真正含義是:

  • false:將迭代的項目,因爲他們收到/消耗 - 基本上,圍繞IDataReader
    • 減去一個迭代塊:你只能重複一次(除非你很樂意重新運行查詢)
    • 加上:你可以遍歷巨大的查詢(數百萬行),而不需要它們全部在內存中 - 因爲你只是真的看在當前租行正在產生
    • 加上:你不需要等待數據的末尾開始迭代 - 只要它至少有一行,你就很好去
    • minus:連接是在迭代時使用,這可能會導致「如果您嘗試以行爲單位調用其他命令,則」連接上已經有一個開放的閱讀器「(或者無論確切的措辭是什麼)錯誤(這可以是通過MARS)
    • 減去緩解:因爲消費者可以做他們每個項目想要的任何東西(這可能需要幾分鐘每行,如果他們正在做的事情複雜),命令/讀者可能開放供較長
  • true(默認):數據被完全消耗爲List<T>它交給它之前還給你
    • 加:您可以重複它,只要你喜歡
    • 減去多次:如果查詢是巨大的,裝載它們全部進入內存(在列表中)可能是昂貴的/不可能的
    • 減去:如果查詢很大,可能會有明顯的延遲,但它會收集最後一行
    • plus:一旦獲取數據,命令是完成 - 因此與後續操作之間不存在衝突
    • 加:只要您獲取數據,命令已經發布的任何資源(鎖等),所以你在服務器上的影響微乎其微。

大多數查詢只返回數據適量的(比如,小於100條記錄),因此我們很高興默認(true)爲大多數場景提供了最合適的行爲。但是我們可以爲您提供選項,以滿足不同的使用場景。