我正在尝试在Linq to SQL中执行存储过程调用所需的时间超过4分钟时抛出TimeoutException。
以下是我的控制器中的代码:
public IEnumerable<Quality> Get(DateTime param1, DateTime param2, string param3)
{
var dc = new VideoDataContext(WebApplication.MonitorServer);
dc.CommandTimeout = 240;
List<Quality> cqs = dc.Vid_GetQualityForVideo(param1, param2,
param3).ToList();
return cqs;
}
由于某种原因,代码执行时间超过(时间更长)超过4分钟,但不会引发超时异常。最后,我得到一个内存异常,用于真正的大查询。
我无法优化查询甚至看不到它,因为我无法访问存储过程。我只能在应用程序中检测到超时。有谁知道为什么我没有得到TimeoutException。
在我的代码中的其他地方,我有非常相似的代码,并且在另一台持有不同数据库的服务器上4分钟后抛出超时。这不会发生在这里。
我可以写信给Data团队改变他们的内容,但我想具体说明问题所在。
谢谢!
编辑:为了澄清我在检索数据之前所看到的,它将永远需要,并注意到传递给客户端的大量数据。我有一个MVC Action Filter来检测行数,如果它超过某个阈值(现在为10000),它只会将错误消息传递给客户端而不是整个数据集。我正在运行的查询返回的方式超过了阈值,但仍需要超过4分钟才能完成。
答案 0 :(得分:1)
如果您的查询很大,.ToList()
可能会导致性能问题。您从查询中获得的IEnumerable<T>
是 lazily 评估的。但是,调用.ToList()
会遍历结果的全部内容,并将其放入生成的List
(cqs
)中。
如果您真的希望将函数返回IEnumerable<Quality>
,那么您可以只返回查询IEnumerable
:
public IEnumerable<Quality> Get(DateTime param1, DateTime param2, string param3)
{
var dc = new VideoDataContext(WebApplication.MonitorServer);
dc.CommandTimeout = 240;
return dc.Vid_GetQualityForVideo(param1, param2, param3);
}
编辑:
为了澄清一下,如果你得到一个内存流,而不是超时流,我怀疑将IEnumerable评估为cqs
就像IEnumerable
迭代一样快地填充内存。我会使用LINQ查询(Filter
等)来截断结果IEnumerable
。
另外(在评论中提醒),我会把我的钱放在你没有得到超时的原因是因为dc.Vid_GetQualityForVideo(param1, param2, param3)
成功评估。以下ToList()
调用它返回导致溢出。对它进行一些基本的断点检查就可以证实这一点。
答案 1 :(得分:0)
可能请求运行良好,您的大数据通过网络接收。在这种情况下,不应发生TimeOut异常。