Тайм-аут SQL через код .NET - PullRequest
       13

Тайм-аут SQL через код .NET

1 голос
/ 28 ноября 2011

Итак, у нас есть процесс, который запускается и вызывает нашу БД для получения некоторых данных. Когда мы запускаем процедуру, вызываемую через SQL Server Management Studio, запуск занимает от 6 до 15 минут, но завершается. Когда мы запускаем его через код, он всегда истекает. Я предполагаю, что ожидаемый диапазон времени ожидания кода превышен, но процесс на самом деле все равно будет работать, если сможет, поскольку это происходит напрямую через интерфейс Management Studio.

Вот подробности исключения:

InnerException: System.Data.SqlClient.SqlException
       Message=Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
       Source=.Net SqlClient Data Provider
       ErrorCode=-2146232060
       Class=11
       LineNumber=0
       Number=-2
       Procedure=""
       Server=KSQCOREDBINT
       State=0

А вот трассировка стека, если она вообще поможет:

StackTrace:
            at System.Data.SqlClient.SqlConnection.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.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
            at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
            at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
            at Chatham.Panda.DataAccessLayer.CoreDataContext.sp_calc_schedule_rates_retrieve(Nullable`1 se_sched_id) in c:\TeamCity\BuildAgent02\work\36e300184c20475\Chatham.Panda.DataAccessLayer\Core.designer.cs:line 2306
            at Chatham.Panda.EndOfDay.EodDataAccess.<>c__DisplayClass15.<SpCalcScheduleRatesRetrieve>b__14(CoreDataManager coreDataManager) in C:\svn\K2\trunk\panda\ScheduleBuilderService\Chatham.Panda.EndOfDay\EodDataAccess.cs:line 134
            at Chatham.Panda.EndOfDay.EodDataAccess.RunStoredProc[T](Func`2 storedProcDelegate, String storedProcName) in C:\svn\K2\trunk\panda\ScheduleBuilderService\Chatham.Panda.EndOfDay\EodDataAccess.cs:line 21

В любом случае, мы можем увеличить выделенный интервал ожидания или что-то в этом роде? Мы постоянно работаем над улучшением хранимого процесса, но это зависит от команды БД. Просто пытаюсь понять, смогу ли я что-нибудь сделать с моей стороны.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

Существует до 3-х тайм-аутов для отслеживания

  • тайм-аут соединения - сколько времени требуется, чтобы открыть соединение с базой данных
  • тайм-аут команды - вот чтоприменяет тебя ты сейчас.Вот как долго может выполняться запрос, прежде чем он закончится.
  • истечение времени ожидания страницы - я не видел, чтобы вы сказали, но если это страница ASP.NET, вы можете запустить время ожидания страницы
3 голосов
/ 28 ноября 2011

Время ожидания команд SQL истекло, потому что для выполнения запроса требуется больше времени.Запустите его в Query Analyzer или Management Studio с представительным объемом данных в базе данных и посмотрите на план выполнения, чтобы выяснить, что происходит медленно.

Если что-то занимает большой процент времени и описанокак «сканирование таблицы» или «сканирование кластеризованного индекса», посмотрите, можете ли вы создать индекс, который превратит эту операцию в поиск ключа (поиск индекса или поиск кластеризованного индекса).

Устранение неполадокТайм-аут SqlExceptions

Вы можете установить CommandTimeout для SqlCommand:

objCmd.CommandTimeout = 600

SqlConnection.ConnectionTimeout только для чтения

...