运行存储过程时无法解释的超时

时间:2014-01-13 07:54:40

标签: c# asp.net sql sql-server sql-server-2008-r2

背景 - 我有一个网站& Windows预定作业,它是MSI的一部分并安装在同一服务器上。最终用户使用该网站创建一些规则,并且计划每天运行该作业,以便为最终用户创建的规则创建平面文件。实际情况比上面说明的要复杂得多。

问题(使用网站) - 网站大部分时间都运行正常,但有时它只是不会加载规则创建页面 - 并且记录它的异常'查询超时或SQL服务器没有响应'

问题(与作业有关) - 作业的行为与网站类似,但有时会出现异常 - “查询超时或SQL服务器无响应”

我尝试了什么 -

  • 我已经将“连接超时”添加到SQL连接字符串中 - 似乎对日志记录没有帮助 - 这会告诉我它是SQL连接超时还是查询超时。
  • 我还运行了网站和网站调用的存储过程。 job - 和 ALL 存储过程在业务定义的超时3600秒内完成。存储过程实际上在一分钟内完成。
  • 我也运行了SQL分析器 - 但TRACES也没有帮助我 - 虽然我可以看到很多交易,但我不能证明服务器出错了。

我寻求什么 - 还有其他可能导致这种情况的原因吗?有什么我可以找的吗?

技术 - SQL Server 2008 R2,ASP.Net,C#.Net

限制 - 由于客户机密性,代码详细信息无法显示,但我对问题持开放态度 - 我会尽量回答这些问题,并牢记客户的机密性。

  

注意 - 已经有查询超时(3600s)&连接超时   (30s)在应用程序配置文件中定义。

4 个答案:

答案 0 :(得分:1)

昨天也遇到了同样的问题。有一个巨大的查询在SQL Server中花费了18秒,但是在200秒之后在C#中耗尽了。我重新启动计算机断开数据库连接甚至断开服务器......没有任何改变。

阅读完一些帖子后,我注意到有关索引的常见提要。所以我删除了我的数据库中的一些索引,放了一些回来,瞧!恢复正常。

也许我认为可能发生了。当我运行一些测试时,我可能仍然留下了一些僵尸连接,我的同事在DB中同时创建了一些表,并将它们链接到我的存储过程中使用的表。即使新创建的表与存储过程无关,将它们与其他表链接也似乎搞乱了索引。为什么只有C#无法正常工作?我的猜测是,当连接SQL Server以外的其他地方时,SQL Server中的内存缓存无法访问。

N.B。就我而言,改变存储过程根本没有任何影响,即使它是某些线程中的常见“解决方案”。

希望如果有人遇到同样的问题,这会有所帮助。如果有人能找到更好的解决方案/解释,请分享!!!

干杯,

答案 1 :(得分:0)

我遇到了与mssql类似的问题,并没有找到任何特殊原因造成这种不稳定的行为。我的解决方案是让db重新编入索引

  

sp_updatestats

每小时一次。

答案 2 :(得分:0)

您可以在存储过程定义中使用WITH RECOMPILE以避免“查询超时或SQL服务器无响应”错误

这是微软的文章:
http://technet.microsoft.com/en-us/library/ms190439.aspx

另见以供参考:
SQL Server: Effects of using 'WITH RECOMPILE' in proc definition?

示例代码:

CREATE PROCEDURE [dbo].[sp_mystoredproc] (@param1 varchar(20) ,@param2  int)   
WITH RECOMPILE   
AS   
... proc code ...

答案 3 :(得分:0)

所以,我在这里和那里尝试了一些东西,并且能够找出根本原因 -

SQL存储过程正在连接来自2个不同数据库的2个表 - 其中一个具有不同数量的记录 - 这些记录由不同的(第三方)作业更新/插入。由于第三方作业的时间和我的工作不一样 - 由于表锁没有出现问题,但是当我的超时时间不足时,大量的记录导致我的作业超时。

但是,正如我所说,我已经给出了3600秒的业务标准命令超时 - 不知何故,Enterprise Library用自己的默认命令超时30秒覆盖了我的自定义超时 - 因此C#代码部分甚至会抛出异常在存储过程完成执行之前。

我做了什么 - 这可能对我们中的一些人有帮助 -

  1. 我从项目
  2. 中删除了Enterprise Library的引用
  3. 清理了我的解决方案并检查了SVN。
  4. 然后清理了SVN。
  5. 我在删除Enterprise Library引用后没有构建应用程序 - 显然它不会因为引用错误而构建。
  6. 之后,我进行了干净的结账并再次添加了Enterprise Library。
  7. 现在它似乎即使有不同数量的记录也能正常工作。