2009-07-10 6 views
1

J'ai un programme winform qui utilise la réplication de fusion pour maintenir une synchronisation SQL Express locale avec un serveur SQL central sur notre réseau. En raison de la nature de cette application, le processus de synchronisation s'exécute automatiquement sur App ouvrir et fermer. La façon dont je le fais (ci-dessous) semble prendre beaucoup de temps. Qu'est-ce qui serait un moyen plus rapide? En dehors des sentiers battus, il serait probablement correct si je vérifiais simplement le serveur lui-même, bien que cela pourrait présenter un trou pour un cas de bord où le serveur est disponible, mais SQL est en panne. Alternativement, peut-être juste vérifier si notre domaine est disponible bien que cela pourrait laisser le même trou, je suppose.Le moyen le plus rapide de savoir si SQL Server est disponible

Merci!

private static bool IsSqlAvailable() 
    { 
     try 
     { 
      var conn = new SqlConnection("Data Source=WWCSTAGE;Initial Catalog=Connect;Integrated Security=True"); 
      conn.Open(); 
      conn.Close(); 
      HUD.IsSQLAvailable = true; 
      return true; 
     } 
     catch (Exception) 
     { 
      HUD.IsSQLAvailable = false; 
      return false; 
     } 
    } 

Comme une note supplémentaire. Ce qui précède est particulièrement lent lorsqu'il est hors réseau. Je mets même le délai d'attente de connexion = 1 et il se trouve toujours à ce point pendant un certain temps.

+1

Si vous définissez un délai d'attente de connexion à 1 seconde et qu'il faut encore un certain temps avant d'échouer, la tentative de connexion n'est peut-être pas à blâmer. Pourrait-il la recherche DNS? Voir http://www.eggheadcafe.com/conversation.aspx?messageid=31241642&threadid=31241641 pour des informations intéressantes sur les délais d'attente de connexion. – Jacob

Répondre

2

Mon conseil habituel dans ce genre de scénario, où vous vérifiez l'existence/la connectivité de quelque chose qui est hors de votre contrôle est: ne le faites pas.

Votre chèque peut passer et un instant plus tard, le résultat n'est plus vrai. Donc, essayez de faire ce que vous voulez faire, en supposant que le serveur SQL est disponible, et gérer les erreurs inévitables gracieusement.

+0

Sauf que cela ne répond pas à mon problème de vitesse. Si je le laisse essayer d'exécuter le processus de synchronisation et attendez qu'il sorte correctement, l'utilisateur a une expérience de chargement très lente. Si je courais le Sync n'importe où autre que Load and Close je pourrais être d'accord avec vous mais comme je ne suis pas, je ne suis pas. Merci pour la réponse si. –

+0

@Paladin - Ok, tant que vous comprenez qu'il y aura des moments où l'ouverture et la fermeture seront lentes (parce que la vérification a réussi, mais le serveur a disparu) et sont préparés pour cela. (Je suggère que dans l'Open, vous fassiez la synchronisation dans un thread d'arrière-plan si possible, faites aussi la synchronisation périodiquement en arrière-plan pendant que l'application est utilisée) –

3

Je voudrais envelopper ma connexion dans une clause using et probablement réduire le délai de connexion dans ma chaîne de connexion (généralement, si le serveur est en place, il devrait se connecter plus rapidement que la valeur par défaut).

0

Vous pensez peut-être trop dur. La disponibilité de votre serveur SQL est essentiellement équivalente à la possibilité de vous y connecter, donc je dirais que votre méthode d'essayer d'ouvrir une connexion est tout à fait valide. Ma seule suggestion serait d'assigner HUD.IsSQLAvailable une fois où vous appelez la méthode puisque vous obtenez déjà une valeur de retour, au lieu de l'assigner deux fois à IsSqlAvailable().

0

Je viens d'écrire une méthode de connexion de test aujourd'hui dans une application que j'écris au travail.

Je viens d'utiliser une simple méthode try catch sur juste un connection.open et connection.close et attrape l'exception si elle échoue. Vous n'avez pas à définir une variable si vous n'en avez pas besoin. Renvoyez juste vrai ou faux. Il va se bloquer pendant quelques secondes si la connexion va échouer.

2

Je pense que vous pouvez simplement demander au port TCP SQL Server. Mais il y a un problème si utilisé des instances nommées.

Questions connexes