SQL连接超时

时间:2011-08-29 12:45:14

标签: asp.net sql-server connection-timeout

我们在其中一个网站上遇到了奇怪的连接超时。

我们的环境由IIS 7 Web服务器(在Windows Server 2008 R2标准版上运行)和SQL Server 2008数据库服务器组成。

在调试引起超时的网站功能时,我们注意到连接本身需要几毫秒才能完成,但调用数据库上的存储过程的SqlCommand在执行期间挂起几分钟,然后加注超时异常。

另一方面,当我们直接在数据库上运行存储过程时,只需2秒即可正确完成执行。

我们已经尝试过以下方法:

  • 网站代码修改SqlCommand超时
  • web.config文件
  • 上的修改执行超时
  • sessionState文件
  • 上的修改web.config超时
  • web.config文件
  • 上修改的授权Cookie超时
  • 修改了IIS上网站属性的连接超时
  • 修改了IIS上的应用程序池关闭时间限制
  • 检查IIS上的应用程序池空闲超时
  • 检查SQL Server属性的执行超时(它设置为0,无限制)
  • 使用其他参数直接在数据库上测试存储过程

我们感谢任何帮助。

Nirav

3 个答案:

答案 0 :(得分:0)

我的存储过程存在同样的问题,这是用户的搜索功能。我尝试了一切,包括ARTIHABORT等.SP加入了很多表,因为用户可以搜索任何东西。 SP的许多参数都是可选的,这意味着它们在SP中的默认值为NULL。没有任何效果。

我通过确保我的ADO.NET代码仅添加用户选择值的参数来“修复”它。 SP在执行时间内从几分钟到几秒钟。我假设只有具有实际值的参数传递给SP时,SQL Server才能更好地处理执行计划。

请注意,这是针对SQL Server 2000的。

答案 1 :(得分:0)

几年前,在将应用程序从SQL2000迁移到SQL2008时,我遇到了类似的问题。

我将OPTION (RECOMPILE)添加到数据库中存在问题的所有存储过程的末尾。在我的情况下,它必须与调用存储过程之间非常不同的参数。强制proc重新编译将迫使SQL提出新的执行计划,而不是尝试使用可能对新params不是最佳的缓存版本。

如果您还没有这样做,请检查您的索引。没有什么可以像缺少急需的索引一样杀死数据库性能。这是一个关于查询的良好链接(http://sqlfool.com/2009/04/a-look-at-missing-indexes/),它将显示缺失的索引。

答案 2 :(得分:0)

超级超级晚期建议,但对其他人来说可能会派上用场:我看到并且更适用于Java的典型问题如下:

您有一个以字符串作为参数的查询。该字符串是数据库中varchar(N)列的搜索条件。但是,您在查询中将字符串param提交为Unicode(nvarchar(N))。这将导致全表扫描并将每个字段值转换为Unicode以进行正确比较,以避免潜在的数据丢失(如果SQL Server将输入参数转换为非Unicode,则可能会丢失信息)。

简单测试:运行查询两次(为了简单起见,我假设它是一个SP):

exec spWhatever 'input'
exec spWhatever N'input'

了解他们的行为方式。此外,您可能需要查看SSMS中活动监视器上的“最近的昂贵查询”部分,并询问执行计划,以澄清情况。

干杯, 埃里克