Depois de trabalhar com MS por uma semana, descobrimos por que isso acontece.
Essencialmente, o aplicativo não está falhando porque precisa ter certeza de que o banco de dados falhou - e a conexão sql está expirando antes que a conexão tenha determinado que o banco de dados falhou.
O processo para confirmar que o banco de dados falhou (com todas as configurações padrão do registro tcp) é:
- tente se comunicar com o diretor, veja que não é mais o principal
- comunique-se com o failover para garantir que ele falhou e que agora é o novo principal.
Quando o principal está inativo, essa comunicação leva cerca de 21 segundos porque:
- tente se comunicar com o diretor, espere 3 segundos, tempo limite
- tente se comunicar com o diretor novamente, espere 6 segundos, tempo limite
- tente se comunicar com o diretor novamente, aguarde 12 segundos, tempo limite
- tente se comunicar com o parceiro de failover, verifique se ele foi reprovado e, por isso, faça failover no aplicativo.
Então, se sua conexão sql não estiver esperando por 21 segundos (provavelmente mais na realidade), o tempo limite será atingido antes de terminar essa dança e não haverá falha alguma.
A solução é definir o tempo limite na sua string de conexão como um valor alto. Usamos 60 segundos apenas para garantir a segurança.
Felicidades