簡體   English   中英

設置EF(6)命令超時如何與流查詢交互

[英]How does setting EF (6) Command Timeout, interact with a streamed Query

在正常的CRUD操作中,我有一個帶有少數繁重查詢的應用程序。

我只是在解決一個問題,一堆代碼調用正在更改上下文的超時而不是重置它。 在運行長查詢之后,我通常希望保留正常的低超時。

對於大多數大型查詢,管理超時非常簡單,因為我將整個數據集都拉到了內存中。 所以我得到:

  • 設置長時間超時
  • 運行查詢
  • 完成查詢
  • 驗證內存中的數據
  • 將超時設置回舊的默認值。

Simples! 吱。

但在一種情況下,數據集太大而無法一次保存在內存中,因此我正在積極利用EF提供流式傳輸的事實-延遲迭代初始的IQueryable,將其作為IEnumerable傳遞,依次處理每個元素,使用Linq調用或yield return語句。

以前這很好,因為我設置了長超時,然后再不減少它(而且超時很大,因此它涵蓋了查詢的執行和所有處理)。 但是現在我想重置它。

如果我天真地這樣做,代碼執行將如下所示:

  • 設置長時間超時
  • 啟動流查詢
  • 將超時設置回舊的默認值。
  • 閱讀並使用返回的第一條記錄。
  • 閱讀並使用返回的最后一條記錄。
  • 流式查詢已完成。

即,在重置超時后查詢仍在執行。

我找不到任何有關CommandTimeouts如何與流查詢交互的文檔。


有誰知道這是如何工作的?

上面的元代碼能否正常工作?

命令超時是否在啟動查詢時固定為每個查詢,還是以其他方式完成?


因此,我真的不了解流查詢的實現細節。 SQL Server是否知道要流式查詢,還是什么?

從客戶端提交查詢的時間到提取查詢在SQL Server上運行的最后一行的時間。 結果可能已被假脫機到內存或TempDb,或者當客戶端獲取行時查詢計划可能正在運行。

SqlCommand.CommandTimeout是客戶端超時,用於測量(對於返回結果的查詢而言)客戶端等待對SqlCommand.ExecuteReader(),SqlDataReader.Read()和SqlDataReader.NextResult()的響應的時間。

命令超時是否在啟動查詢時固定為每個查詢,還是以其他方式完成?

它是SqlCommand上的一個設置,當您在EF中更改超時時,它不應影響正在運行的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM