2011-04-18 15 views

Respuesta

2

Este hilo del Foro Azure tiene algunos enlaces a buenos recursos que cubren este tema. No parece haber nada "oficial" todavía. Pero hay algunos proyectos de código abierto que te dan un buen comienzo.

http://social.msdn.microsoft.com/Forums/en-US/ssdsgetstarted/thread/3a9ed384-5374-438e-a8a4-ff4bd8000738/#27b5251a-bff5-4282-980c-ad43fdd85591

A partir de la respuesta:

http://blogs.msdn.com/b/appfabriccat/archive/2010/10/28/best-practices-for-handling-transient-conditions-in-sql-azure-client-applications.aspx

yo personalmente no utilizaron la biblioteca del blog menciona. En cambio, pude salirse con la tuya con WHILE LOOP con un TRY/CATCH que miraba los Números de error de SQL EXCEPTION específicos que era seguro volver a intentar. También hay un contador que básicamente evita que vuelva a intentarlo para siempre.

+0

Gracias Vyrotek, tendría que ser capaz de compartir su bucle while try/catch por favor? –

9

Estoy usando el Transiet Fault Handling Framework, provisto en lue de una mejor solución por el equipo de EF.

  • Agregue el binario, o el proyecto en el enlace de arriba a su solución, y agregue la referencia a su proyecto.
  • crear instancias de una política de reintento con los parámetros adecuados:

var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
      10, 
      TimeSpan.FromSeconds(0.5), 
      TimeSpan.FromSeconds(2) 
    ) { FastFirstRetry = true }; 
  • Use su objeto de política de reintento para cualquier trabajo atómico en el context.

using(var context = new ...) 
    { 
     ...//Maybe you do something to the database... 
     retryPolicy.ExecuteAction(() => context.SaveChanges()); 
    } 
+1

+1 Sé que esta pregunta ya es bastante antigua, pero es un buen trabajo mencionar el Marco de tratamiento transitorio de fallas. Lo he usado en producción desde hace un tiempo y funciona fantásticamente bien para mí. –

+1

Debe tener mucho cuidado al usar esta técnica si está haciendo SaveChanges() dentro de un TransactionScope, porque en este caso EF no ajusta los SaveChanges en un bloque BEGIN/COMMIT, sino que depende del BEGIN/COMMIT del alcance de la transacción (pruébalo con el analizador SQLServer para ver a qué me refiero). Por lo tanto, si SaveChanges() realizó 5 inserciones y una falló, un reintento posiblemente volverá a insertar el 4 que no tuvo problemas. Esta es probablemente la razón por la cual la resistencia de conexión EF 6 no permite las transacciones definidas por el usuario: [ver] (http://msdn.microsoft.com/en-US/data/dn307226) – JohnB

1

El Equipo Asesor de Clientes de Windows Server AppFabric han proporcionado algunas orientaciones bastante detallada en torno reintentos en this blog post.

Básicamente, tienen varias formas diferentes de usar el Marco de tratamiento de fallas transitorias (que ha sido reemplazado por el Transient Fault Handling Application Block, que es similar) para proporcionar reintentos.

3

El problema con el uso de la biblioteca Transient Fault Handling de acuerdo con la mayoría de la documentación que existe es que lo obliga a ajustar cada llamada a la base de datos en su aplicación.

Si utiliza Entity Framework 6 (actualmente en alfa) entonces hay algún nuevo soporte incorporado para los reintentos transitorios con la base de datos de SQL Azure (con un poco de configuración): aquí es el link

I' Hemos creado una biblioteca que le permite configurar Entity Framework para volver a intentarlo usando el bloque de manejo de fallas sin necesidad de cambiar cada llamada a la base de datos; generalmente solo necesitará cambiar su archivo de configuración y posiblemente una o dos líneas de código.

Esto le permite utilizar para Entity Framework o LINQ to SQL, aquí está el link

9

ha añadido conexión de la resistencia como una nueva característica para ayudar a resolver este Entity Framework 6, citando de Microsoft: "permite la recuperación automática de fallas de conexión transitoria ". Aquí está el Connection Resiliency Spec for EF6 si desea obtener más información.

EF6 at NuGet

+0

¿Está implementado de manera predeterminada? ¿O tenemos que habilitarlo explícitamente? – Zapnologica