2011-04-18 5 views

Répondre

2

Ce fil de discussion Azure contient des liens vers de bonnes ressources couvrant ce sujet. Il ne semble pas y avoir encore quelque chose d'officiel. Mais il y a des projets open source qui vous donnent un bon début.

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

De la réponse:

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

Personnellement, je ne pas utiliser la bibliothèque le blog mentionne. Au lieu de cela, j'ai été en mesure de sortir avec une simple boucle WHILE avec un TRY/CATCH qui a surveillé les numéros d'erreur SQL EXCEPTION spécifiques qui étaient sûrs de réessayer. Il y a aussi un compteur qui l'empêche fondamentalement de «réessayer» pour toujours.

+0

Merci Vyrotek, seriez-vous en mesure de partager votre boucle while try/catch s'il vous plaît? –

9

J'utilise le Transiet Fault Handling Framework, fourni dans la mesure d'une meilleure solution par l'équipe d'EF. Ajoutez le binaire ou le projet dans le lien ci-dessus à votre solution et ajoutez la référence à votre projet.

  • instancier une politique de nouvelle tentative avec les paramètres appropriés:

var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
      10, 
      TimeSpan.FromSeconds(0.5), 
      TimeSpan.FromSeconds(2) 
    ) { FastFirstRetry = true }; 
  • Utilisez votre objet de stratégie de nouvelle tentative pour tout travail atomique sur la context.

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

+1 Je sais que cette question est assez ancienne maintenant, mais il est bon de mentionner le cadre de traitement des fautes transitoires. Je l'utilise dans la production depuis un certain temps et cela fonctionne très bien pour moi. –

+1

Vous devez faire très attention en utilisant cette technique si vous faites SaveChanges() dans un TransactionScope, car dans ce cas, EF n'enveloppe pas le SaveChanges dans un bloc BEGIN/COMMIT, en s'appuyant sur BEGIN/COMMIT de la portée de transaction essayez-le avec le profileur SQLServer pour voir ce que je veux dire). Donc, si le SaveChanges() a effectué 5 insertions et une a échoué, une nouvelle tentative pourrait ré-insérer le 4 qui n'a pas eu de problèmes. C'est probablement pourquoi la résilience de connexion EF 6 n'autorise pas les transactions définies par l'utilisateur: [voir] (http://msdn.microsoft.com/fr-fr/data/dn307226) – JohnB

1

Windows Server AppFabric équipe de conseillers à la clientèle ont fourni des indications assez détaillées autour de this blog post retries. Fondamentalement, ils ont un certain nombre de façons différentes d'utiliser le cadre de gestion des erreurs de transit (qui a été remplacé depuis par le Transient Fault Handling Application Block, qui est similaire) afin de fournir des tentatives.

3

Le problème avec l'utilisation de la bibliothèque Transient Fault Handling selon la plupart de la documentation est qu'il vous oblige à emballer tous les appels de base de données dans votre application.

Si vous utilisez Entity Framework 6 (actuellement en alpha) alors il y a un nouveau soutien en construit pour relances transitoires avec SQL Azure Database (avec un peu de configuration): voici le link

Je Nous avons créé une bibliothèque qui vous permet de configurer Entity Framework pour réessayer en utilisant le bloc Fault Handling sans avoir besoin de changer tous les appels de base de données. En général, vous n'aurez qu'à modifier votre fichier de configuration et éventuellement une ou deux lignes de code.

Cela vous permet de l'utiliser pour Entity Framework ou LINQ Pour Sql, voici le link

Questions connexes