Истекло время ожидания подключения при одновременном поступлении большого количества запросов

У меня есть приложение .Net (REST API), которое обращается к базе данных SQL Server. Иногда, когда есть много запросов API одновременно, я получаю исключение Connection Timeout, из-за которого все запросы не выполняются. Это не всегда так и происходит только тогда, когда на сервер одновременно поступает много запросов.

Сведения об исключении:

System.Data.SqlClient.SqlException (0x80131904): истекло время ожидания подключения. Время ожидания истекло при попытке использовать подтверждение квитирования перед входом в систему. Это могло быть связано с тем, что квитирование перед входом в систему не удалось или сервер не смог ответить вовремя. Время, потраченное на попытку подключения к этому серверу, было - инициализация [Pre-Login] = 4; рукопожатие = 14992; ---> System.ComponentModel.Win32Exception (0x80004005): время ожидания операции истекло.

Любая помощь здесь будет высоко оценена.


person Sam    schedule 31.01.2019    source источник
comment
Возможно, вы захотите подумать о том, как вы подключаетесь к SQL Server. Не могли бы вы предоставить дополнительную информацию о том, как вы подключаетесь к базе данных?   -  person Tasos K.    schedule 31.01.2019
comment
в этом случае может быть несколько причин. 1. Вы используете экспресс-сервер sql. 2. Мертвая блокировка между вашими запросами. 3. Запросы выполняются дольше стандартного таймаута - 30 секунд.   -  person KreminT    schedule 31.01.2019
comment
docs.microsoft. com / en-us / dotnet / framework / data / adonet / sql / может оказаться полезным. Также профилируйте свои запросы SQL-сервера - может произойти множественный выбор для данных неиндексированных столбцов и т. Д. если записываешь данные - то инициируются разные блокировки ....   -  person Vladimir    schedule 31.01.2019
comment
››› рукопожатие перед входом в систему не удалось ‹-------------------------------- Это означает, что соединение не было установлено вообще. Это не безудержный запрос / блокировка / взаимоблокировка, отправленный запрос просто не имеет шансов быть выполнен, поскольку СОЕДИНЕНИЕ САМО СБОЙ   -  person sepupic    schedule 31.01.2019


Ответы (1)


Из этого (проголосовавшего) комментария

в этом случае может быть несколько причин:
1. Вы используете SQL Server Express
2. Мертвая блокировка между вашими запросами
3. Запросы выполнялись дольше стандартного тайм-аута - 30 секунд

Сначала вы должны исключить N1, так как Server Edition не имеет ничего общего с тайм-аутом подключения, установленным client

Затем исключите N2, поскольку взаимоблокировки автоматически разрешаются монитором взаимоблокировок сервера, который контролирует взаимоблокировки каждые 5 секунд или даже реже, когда взаимоблокировки возникают часто.

Затем исключите N3, поскольку connection timeout не имеет ничего общего с execution timeout. И ваш тайм-аут равен CONNECTION таймауту.

Вам следует увеличить connection timeout на вашем клиенте или устранить неполадки на вашем сервере, что там происходит, когда ваш сервер перестает отвечать.

person sepupic    schedule 31.01.2019
comment
Извините, но я не согласен с вашим ответом. Экспресс-версия имеет ограничения, которые могут повлиять на производительность. Далее тупик. Пользователь может заблокировать одну или несколько таблиц. Извините, но мы не видели никаких запросов или таблиц и можем написать только предположение. И, наконец, результат предыдущих причин: медленно запрашивает выполнение (больше стандартного таймаута соединения -30 сек), и соединение закрылось без получения ответа. - person KreminT; 01.02.2019
comment
››› соединение разорвано без получения ответа ‹-------------------------------- означает тайм-аут выполнения. Но соединение, которое вообще не было установлено, является таймаутом CONNECTION. В сообщении об ошибке четко написано: Тайм-аут соединения истек. Это означает, что ваш запрос никогда не запускался. Вы просто вообще не подключились к серверу. Например, если сервер не работает или ваша строка подключения неверна, у вас также есть тайм-аут CONNECTION. - person sepupic; 01.02.2019
comment
Ok. Это правда. Спасибо. Сэм написал: «Когда есть много запросов API одновременно, я получаю исключение Connection Timeout». Я написал только предположение. - person KreminT; 01.02.2019
comment
Возможно, ответ здесь stackoverflow.com/questions/ 15488922 / - person KreminT; 01.02.2019
comment
Второй ответ из опубликованного вами лайка предлагает то же, что и мой ответ: добавить тайм-аут соединения 30 секунд в строку подключения. При первой попытке таймаута подключения следует увеличить - person sepupic; 01.02.2019
comment
Тайм-аут соединения по умолчанию 15 сек. Это много. Больше 15 секунд ждете ответа? Думаю, должно быть лучшее решение. Мы живем не в 20 веке)))))) - person KreminT; 01.02.2019
comment
После вас кажется, что 24 человека, проголосовавшие за этот ответ, были динозаврами. - person sepupic; 01.02.2019
comment
Нет. Это решит эту проблему, но создаст новую с производительностью. Я сказал, что решение должно быть более сложным. И нужно искать причину такой проблемы. - person KreminT; 01.02.2019
comment
... А причиной могут быть даже проблемы с сетью, но их точно НЕТ в вашем списке - person sepupic; 01.02.2019
comment
Окей. Да, может быть, я написал не идеальный комментарий, но это не был ответ, и я написал только предположение. И мы оба не знаем, в чем истинная причина этой проблемы. Думаю, на этом обсуждение закончено. Ваш ответ больше похож на правильный - person KreminT; 01.02.2019
comment
@KreminT Я просто хотел подчеркнуть, что проблема в тайм-ауте CONNECTION, а не в тайм-ауте EXECUTION, и в вашем комментарии есть список возможных причин тайм-аута EXECUTION. Тайм-аут ПОДКЛЮЧЕНИЯ может быть вызван проблемами сети или неправильными настройками подключения, это то, что не позволяет вам ПОДКЛЮЧИТЬСЯ. Это может быть даже брандмауэр, но это не тот случай, когда это не всегда так и происходит только при большом количестве запросов. - person sepupic; 01.02.2019
comment
Пожалуйста, прочтите вопрос Сэма. Я прочитал "Иногда, когда одновременно выполняется много запросов API", я получаю исключение Connection Timeout, из-за которого все запросы не выполняются. И мой ответ, пожалуйста, прочтите его social.msdn.microsoft.com/Forums/sqlserver/en-US/ - person KreminT; 01.02.2019