在正常的CRUD操作中,我有一个带有少数繁重查询的应用程序。
我正在解决一个问题,即一堆代码调用正在更改上下文的超时而不是重置它。在运行长查询之后,我通常希望将正常的低超时时间留在后面。
对于大多数大型查询,管理超时非常简单,因为我将整个数据集拉入了内存。所以我得到:
简单!发出吱吱声。
但是在一种情况下,数据集太大而无法一次保存在内存中,因此我正在积极利用EF提供流式传输的事实-延迟迭代初始的IQueryable,将其作为IEnumerable传递,处理每个元素依次使用Linq调用或yield return
语句。
以前这很好,因为我设置了长超时,然后再不减少它(而且超时很大,因此它涵盖了查询的执行和所有处理)。但是现在我想重置它。
如果我天真地这样做,代码执行将如下所示:
即重置超时后,查询仍在执行。
我找不到任何有关CommandTimeout如何与流查询交互的文档。
有人知道它是如何工作的吗?
上面的元代码是否可以正常工作?
每个查询的命令超时是否在启动查询或以其他方式完成时固定?
就此而言,我真的不了解流查询的实现细节。 SQL Server是否知道要流式查询?还是什么?
答案 0 :(得分:1)
从客户端提交查询的时间到获取查询在SQL Server上运行的最后一行的时间。结果可能已被假脱机到内存或TempDb,或者当客户端获取行时查询计划可能正在运行。
SqlCommand.CommandTimeout是客户端超时,用于测量(对于返回结果的查询而言)客户端等待对SqlCommand.ExecuteReader(),SqlDataReader.Read()和SqlDataReader的响应的时间。 .NextResult()。
每个查询的命令超时是否在启动查询或以其他方式完成时固定?
这是SqlCommand上的一个设置,当您在EF中更改超时时,它不应影响正在运行的查询。