Member 11381291 Ответов: 2

Время ожидания истекло до завершения операции или сервер не отвечает.


У меня есть одна база данных, размещенная на сервере.для одной процедуры хранения используйте вставку или обновление данных в одной таблице.В процедуре используйте Try Catch Block для хранилища данных. для хранения данных используется "пользовательский тип таблицы", также этот тип используется в качестве входного параметра в процедуре хранения.в зависимости от строки данных данные будут обновляться или вставляться.

для этой процедуры иногда возникают следующие исключения -

Исключение - System.Data.SqlClient.SqlException (0x80131904): истек тайм-аут выполнения. Время ожидания истекло до завершения операции или сервер не отвечает. ---> Система.ComponentModel.Win32Exception (0x80004005): тайм-аут операции ожидания
в системе.Данных.Sqlclient как.Объект sqlconnection.OnError(исключение SqlException, логическое breakConnection, действие`1 wrapCloseInAction)
в System.Data.SqlClient.SqlInternalConnection.OnError(исключение SqlException, логическое breakConnection, действие`1 wrapCloseInAction)
в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
в системе.Данных.Sqlclient как.Класс sqldatareader.TryConsumeMetaData()
в System.Data.SqlClient.SqlDataReader.get_MetaData()
в системе.Данных.Sqlclient как.Свойство sqlcommand.FinishExecuteReader(объект sqldatareader, ДС, RunBehavior runBehavior, строки resetOptionsString, логическое isInternal, логическое forDescribeParameterEncryption)
в системе.Данных.Sqlclient как.Свойство sqlcommand.RunExecuteReaderTds(метода commandbehavior cmdBehavior, RunBehavior runBehavior, логическое returnStream, логическое асинхронный, типа int32 время ожидания задач&амп; задач, логическое asyncWrite, логическое inRetry, объект sqldatareader, ДС, логическое describeParameterEncryptionRequest)
в системе.Данных.Sqlclient как.Свойство sqlcommand.RunExecuteReader(метода commandbehavior cmdBehavior, RunBehavior runBehavior, логическое returnStream, метод String, TaskCompletionSource`1 завершение, типа int32 время ожидания задач&амп; задач, логическое и amp; usedCache, логическое asyncWrite, логическое inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
в системе.Данных.Sqlclient как.Свойство sqlcommand.Executescalar так()
в Microsoft.Практика.Энтерпрайзелибрария.Данные.База данных.DoExecuteScalar(команда IDbCommand) в e:\Builds\EntLib\Latest\Source\Blocks\Data\Src\Data\Database.cs:line 476
в Microsoft.Практика.Энтерпрайзелибрария.Данные.База данных.ExecuteScalar(команда DbCommand) в e:\Builds\EntLib\Latest\Source\Blocks\Data\Src\Data\Database.cs:line 998
в PearlSolution.Данных.Test_Param_ValueDAC.SaveParameterValue(объект DataTable dtTestResult, approveLevelID строку, строку stateIDs, строки testregnID)
ClientConnectionId:86f7aed4-1a4c-4662-9d23-413ea828c0a0
Номер Ошибки:-2,Состояние:0,Класс:11

Что я уже пробовал:

В процедуре хранения я изменяю запрос Update и Insert. сначала используйте cursur для хранения или обновления данных.
после этого я меняюсь на

обновление таблицы 1 из таблицы 2(пользовательский тип таблицы)
Вставка в таблицу 1 из таблицы 2(определяемый пользователем тип таблицы)

но все равно у меня эта же ошибка

2 Ответов

Рейтинг:
1

OriginalGriff

Проще говоря, ваша операция обновления занимает слишком много времени, и время ожидания объекта SqlCommand истекает, предполагая, что SQL-сервер "зависает".

Вы могли бы попробовать изменить Свойство sqlcommand.Свойство CommandTimeout (System.Data.SqlClient)[^] к чему-то другому, чем стандартные 30 секунд, но это зависит от вас (и размера вашего стола(ов)), чтобы решить, на сколько его установить.
Попробуйте синхронизировать команду в SSMS, и это должно дать вам представление о том, какой уровень таймаута вам нужен.


Member 11381291

у меня уже есть SqlCommand.CommandTimeout установлен на 120 в коде. тем не менее он получает ошибку

OriginalGriff

И сколько времени занимает выполнение запроса в SSMS?

Member 11381291

это занимает максимум от 14 до 15 секунд. Но эта ошибка иногда случается.

Рейтинг:
0

Wendelius

Если время выполнения инструкции сильно варьируется, это звучит как общесистемная проблема производительности.

Несколько советов
- Используйте инструменты Windows, такие как монитор производительности, чтобы просмотреть рабочую нагрузку сервера. Контролируйте, например, загрузку процессора, объем доступной памяти, подкачку, дисковую и сетевую пропускную способность
- Используйте SQL profiler для обнаружения плохо выполняющихся операторов, которые вызывают ненужную нагрузку на систему
- Убедитесь, что у вас есть правильная индексация, особенно для всех критических утверждений
- При необходимости рассмотрите возможность использования регулятора ресурсов