Время ожидания процедуры из ADO.NET, но не в SSMS - PullRequest
3 голосов
/ 17 августа 2011

У меня есть хранимая процедура, которая дает мне 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)

Значит ли эта трассировка стека что-нибудь для кого-нибудь?Похоже, что мой sproc завершен и истекло время ожидания при попытке прочитать какие-либо метаданные?

Я попытался посмотреть на процесс, пока он работает, и он приостановлен.sys.dm_os_waiting_tasks показывает тип ожидания как IO_COMPLETION, если он используется.Единственные процессы, которые я вижу в базе данных с использованием sp_who2 'active', - это тайм-аут и мое активное окно SSMS, поэтому я не думаю, что это проблема блокировки.Я проверил, что эта база данных имеет те же значения, что и рабочая база данных, и запустил dbcc checkdb без ошибок.Как я могу определить причину тайм-аута?

1 Ответ

6 голосов
/ 17 августа 2011

Вы можете сравнить параметры 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 года, поэтому я не проверял этот запрос.Возможно, вам придется закомментировать одно или несколько имен столбцов.

...