У меня есть служба приложений в Azure, подключенная к базе данных SQL Server в Azure. Служба приложений имеет несколько запускаемых по таймеру веб-заданий, которые взаимодействуют с базой данных.
Я получаю следующее исключение каждый раз, когда выполняется запрос SQL, и ни один из существующих советов мне не помог:
Microsoft.Data.SqlClient.SqlException (0x80131904): истекло время ожидания подключения. Время ожидания истекло на этапе после входа в систему. Соединение могло быть прервано во время ожидания завершения процесса входа в систему и ответа сервера; Или время ожидания истекло при попытке создать несколько активных подключений. Продолжительность попытки подключения к этому серверу составила - [Pre-Login] initialization=124; рукопожатие=49; [Вход] инициализация=0; аутентификация=0; [После входа] завершено=14011;
Уровень службы приложений — S1, и для него включена функция Always On. Уровень SQL — «Общее назначение — без сервера: стандартная серия (Gen5), 1 виртуальное ядро».
Ошибка возникает каждый раз, независимо от данных. Вчера это произошло на данных размером 5 записей. Согласно App Insights, запрос SQL Server занял 14 секунд, прежде чем появилась эта ошибка.
Ошибка никогда не возникает, когда я запускаю приложение локально на своем ПК, используя ту же базу данных Azure. Таким образом, он без особых усилий обработал десятки тысяч записей, поэтому я не думаю, что это проблема конфигурации базы данных.
Насколько я понимаю, у меня есть какая-то проблема с управлением временем жизни соединения в моем приложении, поскольку оно работает локально, когда веб-задание выполняется немедленно, но падает в Azure, когда с момента запуска проходит полдня. Я использую EF Core, я зарегистрировал контекст приложения следующим образом:
collection
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
context.Configuration.GetConnectionString("Database"),
sqlServerOptions =>
{
sqlServerOptions.CommandTimeout(3600);
sqlServerOptions.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null);
}))
... и все сервисы, использующие контекст БД, регистрируются как "ограниченные".
Также может быть проблема с брандмауэром SQL Server, но у него включен параметр «Разрешить службам и ресурсам Azure доступ к этому серверу».
Вы проверили данные аутентификации во (всех) строках подключения? Сообщение об ошибке предполагает, что у вас могут быть включены Integrated Security
или Trusted_Connection
(например, аутентификация Windows/Active Directory).
запрос SQL Server занял 14 секунд, прежде чем получить эту ошибку.
ConnectionTimeout по умолчанию составляет 15 секунд. А бессерверная база данных, которая была приостановлена, обычно требует больше времени, чтобы возобновить ее работу.
Если бессерверная база данных приостановлена, возобновится первый вход в систему. базу данных и вернуть ошибку о том, что база данных недоступен с кодом ошибки 40613. После возобновления работы базы данных необходимо повторить попытку входа в систему, чтобы установить соединение. Клиенты базы данных с логика повторной попытки подключения не должна изменяться. Для подключения параметры логики повторных попыток, встроенные в драйвер SqlClient, см. настраиваемая логика повтора в SqlClient.
Уровень бессерверных вычислений — подключение
Я попробую добавить Connect Timeout=60 в строку подключения. Спасибо!
Как говорится в документе, вам может потребоваться повторить попытку даже при более длительном тайм-ауте соединения.
Возможно, это не постоянное решение, но добавьте
Trust Server Certificate=True;
в качестве атрибута строки подключения (хотя, признаюсь, я не знаю, как, черт возьми, вы это делаете в путанице, известной как EF Core). Я только что наткнулся на это вчера, и это может задержать вас, пока вы не научитесь делать правильные вещи CA/cert.