0

在正常的 CRUD 操作中,我有一个带有少量繁重查询的应用程序。

我只是在解决一个问题,即一堆代码调用正在更改上下文的超时而不是重置它。在我运行我的长查询之后,我一般想留下正常的低超时。

对于大多数大型查询,管理超时非常简单,因为我将整个数据集拉入内存。所以我得到:

  • 设置长超时
  • 运行查询
  • 完成查询
  • 将内存中的数据具体化
  • 将超时设置回它的旧默认值。

简单!吱。

但在一种情况下,数据集太大而无法一次性保存在内存中,因此我积极利用 EF 提供流式传输的事实 - 懒惰地迭代初始 IQueryable,将其作为 IEnumerable 传递,依次处理每个元素,使用 Linq 调用或yield return语句。

以前这很好,因为我设置了长超时,然后从不减少它(超时很大,所以它涵盖了查询的执行和所有处理)。但现在我想重置它。

如果我天真地这样做,代码执行将如下所示:

  • 设置长超时
  • 启动流式查询
  • 将超时设置回它的旧默认值。
  • 读取并使用返回的第一条记录。
  • 读取并使用返回的最后一条记录。
  • 流式查询已完成。

即超时重置后查询仍在执行。

我找不到任何关于 CommandTimeouts 如何与流式查询交互的文档。


有谁知道这是如何工作的?

上述元代码能否正常工作?

每个查询的命令超时是在查询启动时固定的,还是以其他方式完成的?


就此而言,我并不真正了解流式查询的实现细节。SQL Server 是否知道要对查询进行流式处理,还是什么?

4

1 回答 1

1

从客户端提交查询到获取查询在 SQL Server 上运行的最后一行的时间。结果可能已假脱机到内存或 TempDb,或者查询计划可能在客户端获取行时正在运行。

SqlCommand.CommandTimeout是客户端超时,用于测量(在返回结果的查询的情况下)客户端等待对 SqlCommand.ExecuteReader()、SqlDataReader.Read() 和 SqlDataReader.NextResult() 的响应的时间。

每个查询的命令超时是在查询启动时固定的,还是以其他方式完成的?

它是 SqlCommand 上的一个集合,当您在 EF 中更改超时时,它不应该影响正在运行的查询。

于 2019-07-17T17:06:46.333 回答