1

每当在 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 分钟后在另一台拥有不同数据库的服务器上引发超时。它只是没有在这里发生。

我可以写信给数据团队以更改他们的某些内容,但我想具体说明问题所在。

谢谢!

编辑:澄清我之前在检索数据时看到的,这将需要很长时间,并注意到这是大量数据传递给客户端。我有一个 MVC 动作过滤器,它检测行数,如果它超过某个阈值(现在为 10000),它只会将错误消息传递给客户端,而不是整个数据集。我正在运行的查询返回的方式超过了阈值,但仍然需要超过 4 分钟才能完成。

4

2 回答 2

1

如果您的查询很大,.ToList()可能会导致性能问题。IEnumerable<T>你从查询中得到的被懒惰评估。但是,调用 a.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()调用它返回导致溢出。对其进行一些基本的断点检查将确认这一点。

于 2013-11-04T20:38:52.977 回答
0

可能请求运行良好,并且您的大数据是通过网络接收的。在这种情况下,不应发生 TimeOut 异常。

于 2013-11-04T21:25:48.387 回答