[英]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.