过程从ADO超时.. NET,而不是在SSMS



我有一个存储过程,它给了我一个SqlException,因为当我从代码运行它时超时(超时设置为30)。
当我直接在Management Studio中运行过程时,它在1秒内执行。
我也只在针对特定数据库运行它时获得超时。
当我使用其他数据库时,它很快就完成了,没有错误。
下面是完整的错误信息:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)

这个堆栈跟踪对任何人都有意义吗?它看起来像也许我的进程完成,它超时,而试图读取某种元数据?

我试着看进程,而它正在运行,它是暂停。sys。dm_os_waiting_tasks显示等待类型为IO_COMPLETION,如果这有任何用处的话。我在使用sp_who2 'active'的数据库上看到的唯一进程是一个超时和我的活动SSMS窗口,所以我不认为这是一个阻塞问题。我验证了这个数据库具有与工作数据库相同的索引,并运行dbcc checkdb,没有任何错误。如何确定超时的原因?

您可以将超时会话的SET选项与非超时会话的SET选项进行比较:

SELECT
    session_id,
    [ansi_defaults],
    [ansi_null_dflt_on],
    [ansi_nulls],
    [ansi_padding],
    [ansi_warnings],
    [arithabort],
    [concat_null_yields_null],
    [deadlock_priority],
    [quoted_identifier],
    [transaction_isolation_level]
FROM
    sys.dm_exec_sessions
WHERE
    session_id IN (<spid1>, <spid2>);

当你发现一些不同时,在SSMS查询中尝试将每个设置更改为相反的设置,直到你得到超时(或在发送查询之前在应用程序代码中手动设置选项)。现在,我手边没有2005年的实例,所以没有测试这个查询。您可能需要注释掉一个或多个列名。

删除并重新创建SP将清除损坏的缓存执行计划

DROP PROCEDURE [dbo].[YourSPName]
GO
CREATE PROCEDURE [dbo].[YourSPName]
-- your SP Code

相关内容

  • 没有找到相关文章

最新更新