Pregunta

Tengo dos bases de datos de Microsoft SQL 2005 configuradas en un escenario de conmutación por error. Las cadenas de conexión de la aplicación tienen el '' Failover Partner '' especificado en la cadena de conexión.

Cuando la base de datos actualmente activa falla a la base de datos esclava, hay un pequeño período de tiempo para que un usuario pueda obtener una SqlClient.SqlException con el mensaje "Una conexión existente fue cerrada por la fuerza por el host remoto".

¿Esto se debe principalmente a la velocidad con la que las bases de datos están fallando o hay algo más que se puede hacer para evitar estos errores?

¿Fue útil?

Solución

Tienes razón: tiene que ver con el tiempo que tardan las bases de datos en fallar.

La línea de tiempo de conmutación por error de duplicación síncrona es algo así:

  1. El servidor primario A cierra y cierra todas las conexiones. A partir de este momento, cualquier cliente que intente conectarse al servidor A cerrará su conexión a la fuerza.
  2. El servidor primario A se asegura de que sus registros estén completamente sincronizados con el servidor secundario B.
  3. Se inicia el servicio SQL del servidor B.
  4. El servicio SQL del servidor B comienza a aceptar conexiones, y en ese punto los clientes pueden conectarse nuevamente.

No importa cuán rápidos sean sus servidores, habrá un breve período (al menos un segundo) cuando las conexiones se bombardearán. Como dijo Steven Lowe, debes atrapar esa excepción, esperar e intentar nuevamente. Tenga en cuenta que será más complejo si su aplicación emite varias consultas seguidas como parte de una transacción más grande; su transacción podría fallar.

Otros consejos

advertencia: la opción 'socio de conmutación por error' no estaba disponible hace unos años (¡o al menos no lo sabía!), por lo que la siguiente solución puede estar desactualizada

tuvimos que atrapar las excepciones de pérdida de conexión (varios sabores diferentes), esperar unos segundos e intentar nuevamente. Esto requería un contenedor para todas las operaciones de la base de datos para automatizar la lógica de esperar y volver a intentar, lo cual no era mucho trabajo y resultó ser bastante conveniente; El esfuerzo se centró en examinar los códigos de error y los tipos de excepción y en hacer una tabla de decisiones sobre si podríamos volver a intentar la operación de forma segura o no.

Esto se debe a que su aplicación intenta utilizar una conexión existente en el grupo de conexiones. Solo después de que ocurra este error, se borra el grupo de aplicaciones y las nuevas conexiones usan el cuadro de conmutación por error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top