如何设置EF(6)Command Timeout,与streamed Query交互
How does setting EF (6) Command Timeout, interact with a streamed Query
我有一个应用程序,在正常的 CRUD 操作中包含一些繁重的查询。
我只是在解决一个问题,即一堆代码调用正在更改上下文的超时而不是重置它。在我 运行 我的长查询之后,我一般想留下正常的低超时时间。
对于大多数大型查询,管理超时非常简单,因为我将整个数据集拉入内存。所以我得到:
- 设置长超时
- 运行查询
- 完成查询
- 具体化内存中的数据
- 将超时设置回原来的默认值。
简单!吱吱.
但在一种情况下,数据集太大而无法一次性保存在内存中,因此我积极利用 EF 提供流的事实 - 懒惰地迭代初始 IQueryable,将其作为 IEnumerable 传递,处理每个元素依次使用 Linq 调用或 yield return
语句。
以前这很好,因为我设置了很长的超时,然后再也没有减少它(而且超时很大,所以它涵盖了查询的执行和所有处理)。但是现在我想重置它。
如果我天真地这样做,代码执行将如下所示:
- 设置长超时
- 启动流式查询
- 将超时设置回原来的默认值。
- 读取并使用返回的第一条记录。
- 读取并使用返回的最后一条记录。
- 流式查询完成。
即重置超时后查询仍在执行。
我找不到任何关于 CommandTimeouts 如何与流式查询交互的文档。
有人知道这是怎么回事吗?
上面的元代码能否正常工作?
每个查询的命令超时是在查询启动时固定的,还是以其他方式完成的?
就此而言,我不太了解流式查询的实现细节。 SQL 服务器知道要流式传输查询吗?
从客户端提交查询到获取最后一行,查询在 SQL 服务器上 运行。结果可能已被假脱机到内存或 TempDb,或者查询计划可能在客户端获取行时处于活动状态 运行。
SqlCommand.CommandTimeout 是一个 client-side 超时,用于测量(在查询结果为 returns 的情况下)客户端等待对 SqlCommand.ExecuteReader 的响应的时间(), SqlDataReader.Read() 和 SqlDataReader.NextResult().
Is the command timeout fixed per query at the point at which the query is initiated, or done in some other way?
它是在 SqlCommand 上设置的,当您更改 EF 中的超时时,它应该不会影响 运行 查询。
我有一个应用程序,在正常的 CRUD 操作中包含一些繁重的查询。
我只是在解决一个问题,即一堆代码调用正在更改上下文的超时而不是重置它。在我 运行 我的长查询之后,我一般想留下正常的低超时时间。
对于大多数大型查询,管理超时非常简单,因为我将整个数据集拉入内存。所以我得到:
- 设置长超时
- 运行查询
- 完成查询
- 具体化内存中的数据
- 将超时设置回原来的默认值。
简单!吱吱.
但在一种情况下,数据集太大而无法一次性保存在内存中,因此我积极利用 EF 提供流的事实 - 懒惰地迭代初始 IQueryable,将其作为 IEnumerable 传递,处理每个元素依次使用 Linq 调用或 yield return
语句。
以前这很好,因为我设置了很长的超时,然后再也没有减少它(而且超时很大,所以它涵盖了查询的执行和所有处理)。但是现在我想重置它。
如果我天真地这样做,代码执行将如下所示:
- 设置长超时
- 启动流式查询
- 将超时设置回原来的默认值。
- 读取并使用返回的第一条记录。
- 读取并使用返回的最后一条记录。
- 流式查询完成。
即重置超时后查询仍在执行。
我找不到任何关于 CommandTimeouts 如何与流式查询交互的文档。
有人知道这是怎么回事吗?
上面的元代码能否正常工作?
每个查询的命令超时是在查询启动时固定的,还是以其他方式完成的?
就此而言,我不太了解流式查询的实现细节。 SQL 服务器知道要流式传输查询吗?
从客户端提交查询到获取最后一行,查询在 SQL 服务器上 运行。结果可能已被假脱机到内存或 TempDb,或者查询计划可能在客户端获取行时处于活动状态 运行。
SqlCommand.CommandTimeout 是一个 client-side 超时,用于测量(在查询结果为 returns 的情况下)客户端等待对 SqlCommand.ExecuteReader 的响应的时间(), SqlDataReader.Read() 和 SqlDataReader.NextResult().
Is the command timeout fixed per query at the point at which the query is initiated, or done in some other way?
它是在 SqlCommand 上设置的,当您更改 EF 中的超时时,它应该不会影响 运行 查询。