设置EF(6)命令超时如何与流查询进行交互

时间:2019-07-17 13:01:22

标签: sql-server entity-framework entity-framework-6 connection-timeout query-timeout

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

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

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

  • 设置长时间超时
  • 运行查询
  • 完成查询
  • 验证内存中的数据
  • 将超时设置回原来的默认值。

简单!发出吱吱声。

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

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

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

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

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

我找不到任何有关CommandTimeout如何与流查询交互的文档。


有人知道它是如何工作的吗?

上面的元代码是否可以正常工作?

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


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

1 个答案:

答案 0 :(得分:1)

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

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

  

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

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