2009-11-17 74 views
3

我通过Linq-to-SQL调用存储过程。这个存储过程简单地处理我已经插入到另一个表中的数据。大型数据集上,我得到一个超时异常:增加LINQ to SQL存储过程调用的超时时间

"Timeout expired. The timeout period elapsed prior to completion of the operation 
or the server is not responding." 

我不能做任何事情,以加快存储过程 - 它只是从一个表移动到另一个数据。我并不特别想增加数据库连接字符串中的超时时间 - 这是需要很长时间的唯一事情。

这不是一个网络应用程序;该存储过程是在正常Windows服务中的后台线程中调用的。后台线程由WCF调用启动,客户端定期轮询后台线程的结果。

不幸的是,即使存储过程看起来运行良好,存储过程花费的时间太长,并且GetDataContext().spRunStoredProcedure()调用将抛出TimeoutException

我可以增加仅用于此存储过程调用的超时吗?或者有没有办法让存储过程返回“我还没死”,以防止连接超时?

回答

13

在DataContext上,将.CommandTimeout属性设置为更高的秒数值。 SQL Server的default是30秒,您可以将其设置为0以使其不超时。

+1

嗨BK我们如何在连接字符串中为所有存储过程调用设置它 – MaxRecursion 2013-02-08 12:46:30

3

由于它是关于移动数据,并且由于它实际上需要很长时间才会超时:它可能是一种解决方案,将它从Web上移开,并使其成为预定的SQL工作?

除此之外,确实没有无法优化的查询;特别是那些超时的人。增加超时并不是一个很好的解决方案。即使将数据从一个表格移动到另一个表格通常也很仓促。看看你的索引,你如何选择数据,你的锁和统计数据。在启用了执行计划的情况下,在Management Studio中运行一个通常很长的查询,并查看大部分负载(通常可以确定为一个或两个瓶颈因素),并查看是否有任何可以执行的操作关于他们。

+0

你是对的,但是在公司工作的人不知道该怎么做,要自豪地承认,或者只是缺乏资金或雄心去理清它。最后一种选择是人们不知道他们在做什么,并且在尝试与这样的公司合作时会导致严重的问题。我同意这是正确的答案,但是..正如我们所看到的,只需要2秒就可以增加时间并假装从未存在的问题。 – ppumkin 2013-11-04 16:10:24

+1

@ppumkin:当然,第二段主要是针对原始问题中的注释*“我无法做任何事情来加速存储过程”* – 2013-11-04 20:26:17

+0

哦,对。我错过了这一部分 - 我遇到这个问题的唯一原因是因为我正在处理存储过程,而另一方想保持私密性,但我必须在前端实施。他们不知道如何优化速度。他们使用'LIKE%term%'搜索数百万条记录,并想知道为什么查询需要45〜90秒。当我写这篇文章的时候我有一段糟糕的时刻,但我认为你的第二段在当时是高度相关的。我能做什么 - 智能感知现在需要长达90秒.... *叹息* – ppumkin 2013-11-04 20:31:51