Я установил отказоустойчивый кластер Windows Server в тестовой среде и установил на нем кластерный экземпляр SQL Server 2014. Кластер состоит из двух узлов, а имя сети - SQLINSTANCE.
Теперь из небольшого консольного приложения у меня есть простой цикл (который работает нормально), который запрашивает тестовую базу данных каждые 100 мс:
while (true)
{
using (var dbContext = new TestDBContext())
{
foreach (var person in dbContext.People)
{
Console.WriteLine(person.FirstName + " " + person.LastName);
System.Threading.Thread.Sleep(100);
}
}
}
Теперь я принудительно выполняю аварийное переключение в кластере (либо путем выключения одного узла, либо путем перемещения роли SQL-сервера на другой узел из диспетчера кластеров). Процесс переключения при отказе занимает около 50 секунд. Когда отработка отказа завершена, мой тестовый цикл генерирует исключение EntityException, говоря, что «базовый поставщик отказал при открытии». InnerException - это SqlClient.SqlException, в котором говорится: «Невозможно открыть базу данных« TestDB », запрошенную при входе в систему. Ошибка входа в систему. Ошибка входа для пользователя« Домен \ Пользователь »».
Я установил свою строку подключения следующим образом:
<add name="TestDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;
provider connection string="data source=sqlinstance;initial catalog=TestDB;integrated security=True;
MultiSubnetFailover=true;
connect timeout=150;
ConnectRetryCount=15;
ConnectRetryInterval=10;
MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Я ожидал, что SqlClient попытается повторно подключиться к моему экземпляру clusterd 15 раз с интервалом в 10 секунд, а затем успешно повторно подключится, когда отработка отказа завершится. Но он по-прежнему выбрасывает исключения.
Я попытался изменить значения «Тайм-аут подключения», «ConnectRetryCount» и «ConnectRetryInterval», но все равно не удалось полностью восстановить подключение после аварийного переключения ...
Я очень запутался, чего мне здесь не хватает, или я могу не полагаться на базовый SqlClient, и должен ли я, например, предоставлять свою логику повтора owm в DAL ???