Получение периодических ошибок подключения после подключения базы данных SQL Server - PullRequest
1 голос
/ 23 февраля 2012

У меня проблема, которую я не могу решить. У моей команды разработчиков есть набор модульных тестов C #, которые запускаются на базе данных модульных тестов. Перед каждым тестом база данных должна быть восстановлена ​​до начальной точки. Самый быстрый способ достичь этого:

  1. Отключить базу данных.
  2. Перезаписать файлы .mdf и .ldf резервными копиями с подкладкой.
  3. Присоединить базу данных.

Я выполняю эти действия, вызывая команды Transact SQL из C #.

Проблема, с которой я столкнулся, заключается в том, что примерно в 50% случаев открытие соединения с базой данных модульных тестов завершится неудачей - исключения бывают разных типов - но, похоже, все они предполагают, что база данных не существует. Если я добавлю команду «sleep» после оператора Attach, тогда базу данных можно будет каждый раз успешно открывать. Моя интерпретация этого заключается в том, что должен быть какой-то фоновый процесс SQL Server, который запускается на базе данных, чтобы завершить перевод базы данных в оперативный режим. Таким образом, непосредственно после выполнения процедуры sp_attach_db база данных фактически не готова к использованию до истечения нескольких миллисекунд.

Конечно, мое решение может заключаться в том, чтобы выполнять оператор «сна» после каждого подключения к базе данных, но существует 800 таких тестов, поэтому крайне важно, чтобы процесс отсоединения / восстановления / подключения был максимально быстрым.

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

Заранее спасибо.

1 Ответ

1 голос
/ 23 февраля 2012

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

Просто добавьте в строку подключения Pooling=no

PS: Если ваши тесты не так сложны, может быть гораздо быстрее запустить тест внутри транзакции и просто откатить его, когда он завершит очистку БД

...